blob: e12e739436685d3531bc7dde2b079c078179c0b7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
package db
import (
"bytes"
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"github.com/xlgmokha/x/pkg/env"
"github.com/xlgmokha/x/pkg/serde"
"github.com/xlgmokha/x/pkg/x"
)
type Entity interface {
Identifier() string
}
type Storage[T Entity] struct {
dir string
}
func New[T Entity](dir string) *Storage[T] {
fullPath := x.Must(filepath.Abs(dir))
x.Check(os.MkdirAll(fullPath, 0700))
return &Storage[T]{
dir: fullPath,
}
}
func (db *Storage[T]) Save(item T) error {
if db.fileExistsFor(item) {
return nil
}
w := new(bytes.Buffer)
x.Check(serde.To(w, item, serde.YAML))
if env.Fetch("DUMP", "") != "" {
fmt.Println(w.String())
}
return ioutil.WriteFile(db.filePathFor(item), w.Bytes(), 0700)
}
func (db *Storage[T]) filePathFor(item T) string {
return fmt.Sprintf("%v/%v.yaml", db.dir, item.Identifier())
}
func (db *Storage[T]) fileExistsFor(item T) bool {
_, err := os.Stat(db.filePathFor(item))
if err != nil && errors.Is(err, os.ErrNotExist) {
return false
}
return true
}
|