aboutsummaryrefslogtreecommitdiff
path: root/internal/admin/yaml_util.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-29 22:31:11 -0400
committerhistoria <[not public]>2026-06-29 22:31:11 -0400
commit069d3c1c81d71042706372df153254487a765dfc (patch)
treed83a4a3954d2b8304f49d83e365f4c2b075b91eb /internal/admin/yaml_util.go
parent6c5271fb085b4571a10f106391974c249cd84317 (diff)
downloadthehouseoficarus-069d3c1c81d71042706372df153254487a765dfc.tar.gz
feat: wip web admin for mapping and crud
Diffstat (limited to 'internal/admin/yaml_util.go')
-rw-r--r--internal/admin/yaml_util.go117
1 files changed, 117 insertions, 0 deletions
diff --git a/internal/admin/yaml_util.go b/internal/admin/yaml_util.go
new file mode 100644
index 0000000..b97a4f2
--- /dev/null
+++ b/internal/admin/yaml_util.go
@@ -0,0 +1,117 @@
+package admin
+
+import (
+ "bytes"
+ "log"
+ "os"
+ "path/filepath"
+
+ "gopkg.in/yaml.v3"
+)
+
+func readYAMLFile(dataDir, subdir, id string) ([]byte, string, error) {
+ path := filepath.Join(dataDir, subdir, id+".yaml")
+ data, err := os.ReadFile(path)
+ return data, path, err
+}
+
+func writeYAMLFile(path string, data any) ([]byte, error) {
+ var buf bytes.Buffer
+ enc := yaml.NewEncoder(&buf)
+ enc.SetIndent(2)
+ if err := enc.Encode(data); err != nil {
+ return nil, err
+ }
+ enc.Close()
+ content := buf.Bytes()
+ if err := os.WriteFile(path, content, 0644); err != nil {
+ return nil, err
+ }
+ return content, nil
+}
+
+func findYAMLFileInSubdirs(dataDir, subdir, id string) ([]byte, string, error) {
+ base := filepath.Join(dataDir, subdir)
+ entries, err := os.ReadDir(base)
+ if err != nil {
+ return nil, "", err
+ }
+ for _, e := range entries {
+ fullPath := filepath.Join(base, e.Name(), id+".yaml")
+ if data, err := os.ReadFile(fullPath); err == nil {
+ return data, fullPath, nil
+ }
+ subPath := filepath.Join(base, e.Name())
+ subEntries, err := os.ReadDir(subPath)
+ if err != nil {
+ continue
+ }
+ for _, se := range subEntries {
+ fullPath := filepath.Join(subPath, se.Name(), id+".yaml")
+ if data, err := os.ReadFile(fullPath); err == nil {
+ return data, fullPath, nil
+ }
+ }
+ }
+ return nil, "", os.ErrNotExist
+}
+
+func listYAMLFiles(dataDir, subdir string) ([]string, error) {
+ var ids []string
+ base := filepath.Join(dataDir, subdir)
+
+ entries, err := os.ReadDir(base)
+ if err != nil {
+ return nil, err
+ }
+ for _, e := range entries {
+ if !e.IsDir() && filepath.Ext(e.Name()) == ".yaml" {
+ ids = append(ids, e.Name()[:len(e.Name())-5])
+ }
+ }
+ for _, e := range entries {
+ if e.IsDir() {
+ subPath := filepath.Join(base, e.Name())
+ subEntries, err := os.ReadDir(subPath)
+ if err != nil {
+ continue
+ }
+ for _, se := range subEntries {
+ if !se.IsDir() && filepath.Ext(se.Name()) == ".yaml" {
+ ids = append(ids, se.Name()[:len(se.Name())-5])
+ }
+ }
+ }
+ }
+ return ids, nil
+}
+
+func listYAMLFilesDeep(dataDir, subdir string) ([]string, error) {
+ var ids []string
+ base := filepath.Join(dataDir, subdir)
+ err := filepath.WalkDir(base, func(path string, d os.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if !d.IsDir() && filepath.Ext(d.Name()) == ".yaml" {
+ rel, _ := filepath.Rel(base, path)
+ id := rel[:len(rel)-5]
+ ids = append(ids, id)
+ }
+ return nil
+ })
+ return ids, err
+}
+
+func backupFile(path string) []byte {
+ data, err := os.ReadFile(path)
+ if err != nil {
+ log.Printf("backup: failed to read %s: %v", path, err)
+ return nil
+ }
+ return data
+}
+
+func snapshotFile(path string) ([]byte, error) {
+ return os.ReadFile(path)
+}