forked from
rockorager.dev/knit
this repo has no description
1package config
2
3import (
4 "errors"
5 "io"
6 "os"
7 "path"
8 "slices"
9
10 "github.com/pelletier/go-toml/v2"
11)
12
13var globalConfig = make(map[string]any)
14
15func LoadOrCreate() error {
16 cfgDir, err := os.UserConfigDir()
17 if err != nil {
18 return err
19 }
20 cfgPath := path.Join(cfgDir, "knit", "config.toml")
21
22 f, err := os.Open(cfgPath)
23 if errors.Is(err, os.ErrNotExist) {
24 return createConfig()
25 }
26 defer f.Close()
27
28 data, err := io.ReadAll(f)
29 if err != nil {
30 return err
31 }
32
33 if err := toml.Unmarshal(data, &globalConfig); err != nil {
34 return err
35 }
36
37 return nil
38}
39
40func createConfig() error {
41 cfgDir, err := os.UserConfigDir()
42 if err != nil {
43 return err
44 }
45 cfgPath := path.Join(cfgDir, "knit", "config.toml")
46
47 return os.WriteFile(cfgPath, []byte{}, 0o600)
48}
49
50func HandlesForHost(host string) []string {
51 hostCfg, ok := globalConfig[host].(map[string]any)
52 if !ok {
53 return []string{}
54 }
55
56 handles, ok := hostCfg["handles"].([]interface{})
57 if !ok {
58 return []string{}
59 }
60 asStrings := make([]string, 0, len(handles))
61 for _, handle := range handles {
62 asStrings = append(asStrings, handle.(string))
63 }
64 return asStrings
65}
66
67func DefaultHandleForHost(host string) string {
68 handles := HandlesForHost(host)
69 if len(handles) == 0 {
70 return ""
71 }
72 return handles[0]
73}
74
75func AddHandleToHost(host string, handle string) error {
76 handles := HandlesForHost(host)
77 if slices.Contains(handles, handle) {
78 return nil
79 }
80
81 handles = append(handles, handle)
82
83 hostCfg, ok := globalConfig[host].(map[string]any)
84 if !ok {
85 hostCfg = make(map[string]any)
86 }
87
88 hostCfg["handles"] = handles
89 globalConfig[host] = hostCfg
90 return WriteConfig()
91}
92
93func WriteConfig() error {
94 cfgDir, err := os.UserConfigDir()
95 if err != nil {
96 return err
97 }
98 cfgPath := path.Join(cfgDir, "knit", "config.toml")
99 data, err := toml.Marshal(globalConfig)
100 if err != nil {
101 return err
102 }
103
104 return os.WriteFile(cfgPath, data, 0o600)
105}