chore(ejs) Init
This commit is contained in:
commit
2dcdd592d5
3 changed files with 156 additions and 0 deletions
130
ejs.go
Normal file
130
ejs.go
Normal file
|
@ -0,0 +1,130 @@
|
|||
package ejs
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Store struct {
|
||||
path string
|
||||
}
|
||||
|
||||
type Search interface {
|
||||
match([]byte) bool
|
||||
}
|
||||
|
||||
func NewStore(path string) (Store, error) {
|
||||
s := Store{}
|
||||
s.path = path
|
||||
|
||||
err := s.createFolderIfNeeded(path)
|
||||
if err != nil {
|
||||
return Store{}, err
|
||||
}
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (s Store) Save(dataset, id string, data any) error {
|
||||
err := s.createFolderIfNeeded(fmt.Sprintf("%v/%v", s.path, dataset))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
jsonData, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
os.WriteFile(fmt.Sprintf("%v/%v/%v.json", s.path, dataset, id), jsonData, 0600)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s Store) List(dataset string) ([]string, error) {
|
||||
entries, err := os.ReadDir(fmt.Sprintf("%v/%v/", s.path, dataset))
|
||||
if err != nil {
|
||||
return []string{}, err
|
||||
}
|
||||
|
||||
var entrylist []string
|
||||
for _, e := range entries {
|
||||
name := e.Name()
|
||||
name = strings.TrimRight(name, ".json")
|
||||
entrylist = append(entrylist, name)
|
||||
}
|
||||
|
||||
return entrylist, nil
|
||||
}
|
||||
|
||||
func (s Store) Get(dataset, id string, data any) error {
|
||||
content, err := os.ReadFile(fmt.Sprintf("%v/%v/%v.json", s.path, dataset, id))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(content, data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s Store) Scan(dataset string, cbFunc func(id string)) error {
|
||||
ids, err := s.List(dataset)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, id := range ids {
|
||||
cbFunc(id)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s Store) Search(dataset string, searchFilter ...Search) ([]string, error) {
|
||||
ids, err := s.List(dataset)
|
||||
if err != nil {
|
||||
return []string{}, err
|
||||
}
|
||||
|
||||
found := []string{}
|
||||
|
||||
for _, id := range ids {
|
||||
content, err := os.ReadFile(fmt.Sprintf("%v/%v/%v.json", s.path, dataset, id))
|
||||
if err != nil {
|
||||
return []string{}, err
|
||||
}
|
||||
|
||||
match := true
|
||||
for _, search := range searchFilter {
|
||||
if !search.match(content) {
|
||||
match = false
|
||||
}
|
||||
}
|
||||
|
||||
if match {
|
||||
found = append(found, id)
|
||||
}
|
||||
}
|
||||
|
||||
return found, nil
|
||||
}
|
||||
|
||||
func (s Store) createFolderIfNeeded(path string) error {
|
||||
_, err := os.Stat(path)
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
if !os.IsNotExist(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
err = os.Mkdir(path, 0700)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
3
go.mod
Normal file
3
go.mod
Normal file
|
@ -0,0 +1,3 @@
|
|||
module git.keks.cloud/kekskurse/ejs
|
||||
|
||||
go 1.22.2
|
23
searchGJson.go
Normal file
23
searchGJson.go
Normal file
|
@ -0,0 +1,23 @@
|
|||
package ejs
|
||||
|
||||
import (
|
||||
"github.com/tidwall/gjson"
|
||||
)
|
||||
|
||||
type SearchGJsoniString struct {
|
||||
JsonPath string
|
||||
CompareMethode string
|
||||
Value string
|
||||
}
|
||||
|
||||
func (s SearchGJsoniString) match(data []byte) bool {
|
||||
value := gjson.Get(string(data), s.JsonPath)
|
||||
switch s.CompareMethode {
|
||||
case "=":
|
||||
if value.String() == s.Value {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
return false
|
||||
}
|
Reference in a new issue