github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/types/metadata/load.go (about) 1 package metadata 2 3 import ( 4 "fmt" 5 6 "github.com/docker/app/internal" 7 "github.com/docker/app/internal/yaml" 8 "github.com/docker/app/specification" 9 "github.com/docker/cli/cli/compose/loader" 10 "github.com/pkg/errors" 11 ) 12 13 // Load validates the given data and loads it into a metadata struct 14 func Load(data []byte) (AppMetadata, error) { 15 if err := validateRawMetadata(data); err != nil { 16 return AppMetadata{}, err 17 } 18 var meta AppMetadata 19 if err := yaml.Unmarshal(data, &meta); err != nil { 20 return AppMetadata{}, errors.Wrap(err, "failed to unmarshal metadata") 21 } 22 return meta, nil 23 } 24 25 func validateRawMetadata(metadata []byte) error { 26 metadataYaml, err := loader.ParseYAML(metadata) 27 if err != nil { 28 return fmt.Errorf("failed to parse application metadata: %s", err) 29 } 30 if err := specification.Validate(metadataYaml, internal.MetadataVersion); err != nil { 31 return fmt.Errorf("failed to validate metadata:\n%s", err) 32 } 33 return nil 34 }