lockbox

password manager
Log | Files | Refs | README | LICENSE

commit d9575777b7e5a254df56c230921b074fcca760b9
parent abd3bf6f657deac9baea40fb286751979fe6321e
Author: Sean Enck <sean@ttypty.com>
Date:   Fri,  6 Dec 2024 22:07:01 -0500

get overlay of configs to work properly

Diffstat:
Minternal/config/toml.go | 40++++++++++++++++++++++++----------------
1 file changed, 24 insertions(+), 16 deletions(-)

diff --git a/internal/config/toml.go b/internal/config/toml.go @@ -199,11 +199,16 @@ func generateDetailText(key string) (string, error) { // LoadConfig will read the input reader and use the loader to source configuration files func LoadConfig(r io.Reader, loader Loader) ([]ShellEnv, error) { - m := make(map[string]interface{}) - if err := overlayConfig(r, 1, &m, loader); err != nil { + maps, err := readConfigs(r, 1, loader) + if err != nil { return nil, err } - m = flatten(m, "") + m := make(map[string]interface{}) + for _, config := range maps { + for k, v := range flatten(config, "") { + m[k] = v + } + } var res []ShellEnv for k, v := range m { export := strings.ToUpper(k) @@ -254,21 +259,22 @@ func LoadConfig(r io.Reader, loader Loader) ([]ShellEnv, error) { return res, nil } -func overlayConfig(r io.Reader, depth int, m *map[string]interface{}, loader Loader) error { +func readConfigs(r io.Reader, depth int, loader Loader) ([]map[string]interface{}, error) { if depth > maxDepth { - return fmt.Errorf("too many nested includes (%d > %d)", depth, maxDepth) + return nil, fmt.Errorf("too many nested includes (%d > %d)", depth, maxDepth) } d := toml.NewDecoder(r) - if _, err := d.Decode(m); err != nil { - return err + m := make(map[string]interface{}) + if _, err := d.Decode(&m); err != nil { + return nil, err } - res := *m - includes, ok := res[isInclude] + maps := []map[string]interface{}{m} + includes, ok := m[isInclude] if ok { - delete(*m, isInclude) + delete(m, isInclude) including, err := parseStringArray(includes) if err != nil { - return err + return nil, err } if len(including) > 0 { for _, s := range including { @@ -277,23 +283,25 @@ func overlayConfig(r io.Reader, depth int, m *map[string]interface{}, loader Loa if strings.Contains(use, "*") { matched, err := filepath.Glob(use) if err != nil { - return err + return nil, err } files = matched } for _, file := range files { reader, err := loader(file) if err != nil { - return err + return nil, err } - if err := overlayConfig(reader, depth+1, m, loader); err != nil { - return err + results, err := readConfigs(reader, depth+1, loader) + if err != nil { + return nil, err } + maps = append(maps, results...) } } } } - return nil + return maps, nil } func parseStringArray(value interface{}) ([]string, error) {