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  }