github.com/juju/charm/v11@v11.2.0/resources.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the LGPLv3, see LICENCE file for details.
     3  
     4  package charm
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/schema"
    11  
    12  	"github.com/juju/charm/v11/resource"
    13  )
    14  
    15  var resourceSchema = schema.FieldMap(
    16  	schema.Fields{
    17  		"type":        schema.String(),
    18  		"filename":    schema.String(), // TODO(ericsnow) Change to "path"?
    19  		"description": schema.String(),
    20  	},
    21  	schema.Defaults{
    22  		"type":        resource.TypeFile.String(),
    23  		"filename":    "",
    24  		"description": "",
    25  	},
    26  )
    27  
    28  func parseMetaResources(data interface{}) (map[string]resource.Meta, error) {
    29  	if data == nil {
    30  		return nil, nil
    31  	}
    32  
    33  	result := make(map[string]resource.Meta)
    34  	for name, val := range data.(map[string]interface{}) {
    35  		meta, err := parseResourceMeta(name, val)
    36  		if err != nil {
    37  			return nil, err
    38  		}
    39  		result[name] = meta
    40  	}
    41  
    42  	return result, nil
    43  }
    44  
    45  func validateMetaResources(resources map[string]resource.Meta) error {
    46  	for name, res := range resources {
    47  		if res.Name != name {
    48  			return fmt.Errorf("mismatch on resource name (%q != %q)", res.Name, name)
    49  		}
    50  		if err := res.Validate(); err != nil {
    51  			return err
    52  		}
    53  	}
    54  	return nil
    55  }
    56  
    57  // parseResourceMeta parses the provided data into a Meta, assuming
    58  // that the data has first been checked with resourceSchema.
    59  func parseResourceMeta(name string, data interface{}) (resource.Meta, error) {
    60  	meta := resource.Meta{
    61  		Name: name,
    62  	}
    63  
    64  	if data == nil {
    65  		return meta, nil
    66  	}
    67  	rMap := data.(map[string]interface{})
    68  
    69  	if val := rMap["type"]; val != nil {
    70  		var err error
    71  		meta.Type, err = resource.ParseType(val.(string))
    72  		if err != nil {
    73  			return meta, errors.Trace(err)
    74  		}
    75  	}
    76  
    77  	if val := rMap["filename"]; val != nil {
    78  		meta.Path = val.(string)
    79  	}
    80  
    81  	if val := rMap["description"]; val != nil {
    82  		meta.Description = val.(string)
    83  	}
    84  
    85  	return meta, nil
    86  }