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 }