package budget import "fmt" func (c config) validate() error { for _, name := range keys(c.Profiles) { if _, err := c.properties(name); err != nil { return fmt.Errorf("profiles.%s: %w", name, err) } } check := func(field, name string) error { if _, err := c.getProfile(name); err != nil { return fmt.Errorf("%s: %w", field, err) } return nil } for _, field := range []struct { name string groups map[string][]string }{ {"apps", c.Apps}, {"units", c.Units}, {"prefixes", c.Prefixes}, } { for _, name := range keys(field.groups) { if err := check(field.name+"."+name, name); err != nil { return err } } } for _, field := range []struct { name string refs map[string]string }{ {"commands", c.Commands}, {"shared", c.Shared}, } { for _, key := range keys(field.refs) { if err := check(field.name+"."+key, field.refs[key]); err != nil { return err } } } if c.Python != "" { if err := check("python", c.Python); err != nil { return err } } for i, device := range c.Devices { for _, name := range keys(device.Limits) { if err := check(fmt.Sprintf("devices[%d].limits.%s", i, name), name); err != nil { return err } } } for _, name := range keys(c.Prefixes) { for _, directory := range c.Prefixes[name] { if _, err := dropSection(directory); err != nil { return fmt.Errorf("prefixes.%s: %w", name, err) } } } return nil }