diff options
Diffstat (limited to 'config.go')
-rw-r--r-- | config.go | 37 |
1 files changed, 33 insertions, 4 deletions
@@ -1,7 +1,9 @@ package main import ( + "fmt" "io/ioutil" + "sort" "gopkg.in/yaml.v2" ) @@ -17,18 +19,45 @@ type Package struct { Repo string `yaml:"repo"` } +// ensureAlphabetical checks that the packages are listed alphabetically in the configuration. +func ensureAlphabetical(data []byte) bool { + // A yaml.MapSlice perservers ordering of keys: https://godoc.org/gopkg.in/yaml.v2#MapSlice + var c struct { + Packages yaml.MapSlice `yaml:"packages"` + } + + if err := yaml.Unmarshal(data, &c); err != nil { + return false + } + + packageNames := make([]string, 0, len(c.Packages)) + for _, v := range c.Packages { + name, ok := v.Key.(string) + if !ok { + return false + } + packageNames = append(packageNames, name) + } + + return sort.StringsAreSorted(packageNames) +} + // Parse takes a path to a yaml file and produces a parsed Config -func Parse(path string) (Config, error) { +func Parse(path string) (*Config, error) { var c Config data, err := ioutil.ReadFile(path) if err != nil { - return c, err + return nil, err } if err := yaml.Unmarshal(data, &c); err != nil { - return c, err + return nil, err + } + + if !ensureAlphabetical(data) { + return nil, fmt.Errorf("packages in %s must be alphabetically ordered", path) } - return c, err + return &c, err } |