mirror of
https://github.com/danielmiessler/fabric
synced 2024-11-08 07:11:06 +00:00
149 lines
3.5 KiB
Go
149 lines
3.5 KiB
Go
package db
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/samber/lo"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
type Storage struct {
|
|
Label string
|
|
Dir string
|
|
ItemIsDir bool
|
|
FileExtension string
|
|
}
|
|
|
|
func (o *Storage) Configure() (err error) {
|
|
if err = os.MkdirAll(o.Dir, os.ModePerm); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// GetNames finds all patterns in the patterns directory and enters the id, name, and pattern into a slice of Entry structs. it returns these entries or an error
|
|
func (o *Storage) GetNames() (ret []string, err error) {
|
|
var entries []os.DirEntry
|
|
if entries, err = os.ReadDir(o.Dir); err != nil {
|
|
err = fmt.Errorf("could not read items from directory: %v", err)
|
|
return
|
|
}
|
|
|
|
if o.ItemIsDir {
|
|
ret = lo.FilterMap(entries, func(item os.DirEntry, index int) (ret string, ok bool) {
|
|
if ok = item.IsDir(); ok {
|
|
ret = item.Name()
|
|
}
|
|
return
|
|
})
|
|
} else {
|
|
if o.FileExtension == "" {
|
|
ret = lo.FilterMap(entries, func(item os.DirEntry, index int) (ret string, ok bool) {
|
|
if ok = !item.IsDir(); ok {
|
|
ret = item.Name()
|
|
}
|
|
return
|
|
})
|
|
} else {
|
|
ret = lo.FilterMap(entries, func(item os.DirEntry, index int) (ret string, ok bool) {
|
|
if ok = !item.IsDir() && filepath.Ext(item.Name()) == o.FileExtension; ok {
|
|
ret = strings.TrimSuffix(item.Name(), o.FileExtension)
|
|
}
|
|
return
|
|
})
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (o *Storage) ListNames() (err error) {
|
|
var names []string
|
|
if names, err = o.GetNames(); err != nil {
|
|
return
|
|
}
|
|
|
|
if len(names) == 0 {
|
|
fmt.Printf("\nNo %v\n", o.Label)
|
|
return
|
|
}
|
|
|
|
fmt.Printf("\n%v:\n", o.Label)
|
|
for _, item := range names {
|
|
fmt.Printf("\t%s\n", item)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (o *Storage) BuildFilePathByName(name string) (ret string) {
|
|
ret = o.BuildFilePath(o.buildFileName(name))
|
|
return
|
|
}
|
|
|
|
func (o *Storage) BuildFilePath(fileName string) (ret string) {
|
|
ret = filepath.Join(o.Dir, fileName)
|
|
return
|
|
}
|
|
|
|
func (o *Storage) buildFileName(name string) string {
|
|
return fmt.Sprintf("%s%v", name, o.FileExtension)
|
|
}
|
|
|
|
func (o *Storage) Delete(name string) (err error) {
|
|
if err = os.Remove(o.BuildFilePathByName(name)); err != nil {
|
|
err = fmt.Errorf("could not delete %s: %v", name, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (o *Storage) Exists(name string) (ret bool) {
|
|
_, err := os.Stat(o.BuildFilePathByName(name))
|
|
ret = !os.IsNotExist(err)
|
|
return
|
|
}
|
|
|
|
func (o *Storage) Rename(oldName, newName string) (err error) {
|
|
if err = os.Rename(o.BuildFilePathByName(oldName), o.BuildFilePathByName(newName)); err != nil {
|
|
err = fmt.Errorf("could not rename %s to %s: %v", oldName, newName, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (o *Storage) Save(name string, content []byte) (err error) {
|
|
if err = os.WriteFile(o.BuildFilePathByName(name), content, 0644); err != nil {
|
|
err = fmt.Errorf("could not save %s: %v", name, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (o *Storage) Load(name string) (ret []byte, err error) {
|
|
if ret, err = os.ReadFile(o.BuildFilePathByName(name)); err != nil {
|
|
err = fmt.Errorf("could not load %s: %v", name, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (o *Storage) SaveAsJson(name string, item interface{}) (err error) {
|
|
var jsonString []byte
|
|
if jsonString, err = json.Marshal(item); err == nil {
|
|
err = o.Save(name, jsonString)
|
|
} else {
|
|
err = fmt.Errorf("could not marshal %s: %s", name, err)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func (o *Storage) LoadAsJson(name string, item interface{}) (err error) {
|
|
var content []byte
|
|
if content, err = o.Load(name); err != nil {
|
|
return
|
|
}
|
|
|
|
if err = json.Unmarshal(content, &item); err != nil {
|
|
err = fmt.Errorf("could not unmarshal %s: %s", name, err)
|
|
}
|
|
return
|
|
}
|