8
8
"bytes"
9
9
"fmt"
10
10
"io"
11
- "reflect"
12
11
"sort"
13
12
14
13
"github.com/golang/dep/gps"
@@ -19,10 +18,6 @@ import (
19
18
20
19
const ManifestName = "Gopkg.toml"
21
20
22
- var ManifestFields = []string {
23
- "dependencies" , "overrides" , "ignored" , "required" , "metadata" ,
24
- }
25
-
26
21
type Manifest struct {
27
22
Dependencies gps.ProjectConstraints
28
23
Ovr gps.ProjectConstraints
@@ -57,31 +52,37 @@ func validateManifest(s string) ([]error, error) {
57
52
58
53
// Look for unknown fields and raise warnings
59
54
for prop , val := range manifest {
60
- isValidField := false
61
- for _ , v := range ManifestFields {
62
- if prop == v {
63
- isValidField = true
64
-
65
- // For metadata, check if it is a map type
66
- if prop == "metadata" {
67
- isValidMetadata := false
68
- if metadata , ok := val .([]interface {}); ok {
69
- for _ , v := range metadata {
70
- if reflect .TypeOf (v ).Kind () == reflect .Map {
71
- isValidMetadata = true
72
- } else {
73
- isValidMetadata = false
74
- break
75
- }
55
+ switch prop {
56
+ case "metadata" :
57
+ // Invalid if type assertion fails. Not a TOML array of tables.
58
+ // This check is enough for map validation because any non-key-value
59
+ // pair inside array of tables becomes an invalid TOML and parser
60
+ // would fail.
61
+ if _ , ok := val .([]interface {}); ! ok {
62
+ errs = append (errs , errors .New ("metadata should be a TOML array of tables" ))
63
+ }
64
+ case "dependencies" , "overrides" :
65
+ // Invalid if type assertion fails. Not a TOML array of tables.
66
+ if rawProj , ok := val .([]interface {}); ok {
67
+ // Iterate through each array of tables
68
+ for _ , v := range rawProj {
69
+ // Check the individual field's key to be valid
70
+ for key , _ := range v .(map [string ]interface {}) {
71
+ // Check if the key is valid
72
+ switch key {
73
+ case "name" , "branch" , "revision" , "version" , "source" :
74
+ // valid key
75
+ default :
76
+ // unknown/invalid key
77
+ errs = append (errs , fmt .Errorf ("Invalid key %q in %q" , key , prop ))
76
78
}
77
79
}
78
- if ! isValidMetadata {
79
- errs = append (errs , errors .New ("metadata should consist of key-value pairs" ))
80
- }
81
80
}
81
+ } else {
82
+ errs = append (errs , fmt .Errorf ("%v should be a TOML array of tables" , prop ))
82
83
}
83
- }
84
- if ! isValidField {
84
+ case "ignored" , "required" :
85
+ default :
85
86
errs = append (errs , fmt .Errorf ("Unknown field in manifest: %v" , prop ))
86
87
}
87
88
}
0 commit comments