58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package localdb
|
|
|
|
import (
|
|
common "access-manager-api/app/common"
|
|
"encoding/json"
|
|
"os"
|
|
"reflect"
|
|
)
|
|
|
|
func (db *DB) load(localDBPath string) error {
|
|
db.data = make(map[string]common.Pool)
|
|
db.path = localDBPath
|
|
|
|
root, err := os.OpenRoot(".")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer root.Close()
|
|
|
|
content, err := root.ReadFile(localDBPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = json.Unmarshal(content, &db.data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (db *DB) save() error {
|
|
localDBPath := db.path
|
|
// write to file with pretty print for readability reasons
|
|
json, err := json.MarshalIndent(db.data, "", "\t")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = os.WriteFile(localDBPath, []byte(json), 0600)
|
|
return err
|
|
}
|
|
|
|
// MergeNonZero overwrites fields in dst with fields in src iff src is not a zero value.
|
|
func MergeNonZero[T any](dst *T, src *T) {
|
|
vDst := reflect.ValueOf(dst).Elem()
|
|
vSrc := reflect.ValueOf(src).Elem()
|
|
|
|
for i := 0; i < vDst.NumField(); i++ {
|
|
dstField := vDst.Field(i)
|
|
srcField := vSrc.Field(i)
|
|
|
|
// Only set if the field is exported (CanSet) and the source is not a zero value
|
|
if dstField.CanSet() && !srcField.IsZero() {
|
|
dstField.Set(srcField)
|
|
}
|
|
}
|
|
}
|