aboutsummaryrefslogtreecommitdiff
path: root/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'config.go')
-rw-r--r--config.go37
1 files changed, 33 insertions, 4 deletions
diff --git a/config.go b/config.go
index 5071f37..735b147 100644
--- a/config.go
+++ b/config.go
@@ -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
}