Allow map variables from json
A JSON object will be decoded as a list with a single map value. This will be properly coerced later, so let it through the initial config semantic checks.
This commit is contained in:
parent
e12f42a8b5
commit
3297a460c7
|
@ -108,30 +108,25 @@ func smcUserVariables(c *config.Config, vs map[string]interface{}) []error {
|
|||
switch proposedValue.(type) {
|
||||
case string:
|
||||
continue
|
||||
default:
|
||||
errs = append(errs, fmt.Errorf("variable %s should be type %s, got %s",
|
||||
name, declaredType.Printable(), hclTypeName(proposedValue)))
|
||||
}
|
||||
case config.VariableTypeMap:
|
||||
switch proposedValue.(type) {
|
||||
switch v := proposedValue.(type) {
|
||||
case map[string]interface{}:
|
||||
continue
|
||||
default:
|
||||
errs = append(errs, fmt.Errorf("variable %s should be type %s, got %s",
|
||||
name, declaredType.Printable(), hclTypeName(proposedValue)))
|
||||
case []map[string]interface{}:
|
||||
// if we have a list of 1 map, it will get coerced later as needed
|
||||
if len(v) == 1 {
|
||||
continue
|
||||
}
|
||||
}
|
||||
case config.VariableTypeList:
|
||||
switch proposedValue.(type) {
|
||||
case []interface{}:
|
||||
continue
|
||||
default:
|
||||
errs = append(errs, fmt.Errorf("variable %s should be type %s, got %s",
|
||||
name, declaredType.Printable(), hclTypeName(proposedValue)))
|
||||
}
|
||||
default:
|
||||
errs = append(errs, fmt.Errorf("variable %s should be type %s, got %s",
|
||||
name, declaredType.Printable(), hclTypeName(proposedValue)))
|
||||
}
|
||||
errs = append(errs, fmt.Errorf("variable %s should be type %s, got %s",
|
||||
name, declaredType.Printable(), hclTypeName(proposedValue)))
|
||||
}
|
||||
|
||||
// TODO(mitchellh): variables that are unknown
|
||||
|
|
|
@ -38,3 +38,20 @@ func TestSMCUserVariables(t *testing.T) {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
func TestSMCUserVariables_mapFromJSON(t *testing.T) {
|
||||
c := testConfig(t, "uservars-map")
|
||||
|
||||
// ensure that a single map in a list can satisfy a map variable, since it
|
||||
// will be coerced later to a map
|
||||
err := smcUserVariables(c, map[string]interface{}{
|
||||
"test_map": []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
variable "test_map" {
|
||||
type = "map"
|
||||
}
|
Loading…
Reference in New Issue