func (s *S) TestStrictFieldMap(c *gc.C) { fields := schema.Fields{ "a": schema.Const("A"), "b": schema.Const("B"), "c": schema.Const("C"), } defaults := schema.Defaults{ "b": schema.Omit, "c": "C", } s.sch = schema.StrictFieldMap(fields, defaults) assertFieldMap(c, s.sch) out, err := s.sch.Coerce(map[string]interface{}{"a": "A", "b": "B", "d": "D"}, aPath) c.Assert(out, gc.IsNil) c.Assert(err, gc.ErrorMatches, `<path>: unknown key "d" \(value "D"\)`) out, err = s.sch.Coerce(map[string]interface{}{"a": "A", "b": "B", "d": "D"}, nil) c.Assert(out, gc.IsNil) c.Assert(err, gc.ErrorMatches, `unknown key "d" \(value "D"\)`) }
func (s CredentialSchema) schemaChecker() (schema.Checker, error) { fields := make(environschema.Fields) for _, field := range s { fields[field.Name] = environschema.Attr{ Description: field.Description, Type: environschema.Tstring, Group: environschema.AccountGroup, Mandatory: field.FileAttr == "" && !field.Optional, Secret: field.Hidden, Values: field.Options, } } // TODO(axw) add support to environschema for attributes whose values // can be read in from a file. for _, field := range s { if field.FileAttr == "" { continue } if _, ok := fields[field.FileAttr]; ok { return nil, errors.Errorf("duplicate field %q", field.FileAttr) } fields[field.FileAttr] = environschema.Attr{ Description: field.Description + " (file)", Type: environschema.Tstring, Group: environschema.AccountGroup, Mandatory: false, Secret: false, } } schemaFields, schemaDefaults, err := fields.ValidationSchema() if err != nil { return nil, errors.Trace(err) } return schema.StrictFieldMap(schemaFields, schemaDefaults), nil }