in load.go [285:325]
func (f *extensionFields) UnmarshalYAML(dt []byte) error {
// We need to store the raw yaml data for each extension key.
// Parse the yaml, grab all the extension keys and store the raw values in f.
parsed, err := parser.ParseBytes(dt, parser.ParseComments)
if err != nil {
return errors.Wrapf(err, "error parsing yaml: \n%s", string(dt))
}
if len(parsed.Docs) != 1 {
return errors.New("expected exactly one yaml document")
}
doc := parsed.Docs[0]
if doc.Body == nil {
return nil
}
body, ok := doc.Body.(*ast.MappingNode)
if !ok {
return errors.Errorf("expected a mapping node, got %T", body)
}
var ext extensionFields
for _, v := range body.Values {
key := v.Key.String()
if !strings.HasPrefix(key, "x-") && !strings.HasPrefix(key, "X-") {
return errors.Errorf("extension mapping key %q must not start with x-", key)
}
if ext == nil {
ext = make(extensionFields)
}
ext[key] = rawYAML(v.Value.String())
}
if ext != nil {
*f = ext
}
return nil
}