github.com/juju/charm/v11@v11.2.0/payloads.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/names/v4" 10 "github.com/juju/schema" 11 ) 12 13 var payloadClassSchema = schema.FieldMap( 14 schema.Fields{ 15 "type": schema.String(), 16 }, 17 schema.Defaults{}, 18 ) 19 20 // PayloadClass holds the information about a payload class, as stored 21 // in a charm's metadata. 22 type PayloadClass struct { 23 // Name identifies the payload class. 24 Name string 25 26 // Type identifies the type of payload (e.g. kvm, docker). 27 Type string 28 } 29 30 func parsePayloadClasses(data interface{}) map[string]PayloadClass { 31 if data == nil { 32 return nil 33 } 34 35 result := make(map[string]PayloadClass) 36 for name, val := range data.(map[string]interface{}) { 37 result[name] = parsePayloadClass(name, val) 38 } 39 40 return result 41 } 42 43 func parsePayloadClass(name string, data interface{}) PayloadClass { 44 payloadClass := PayloadClass{ 45 Name: name, 46 } 47 if data == nil { 48 return payloadClass 49 } 50 pcMap := data.(map[string]interface{}) 51 52 if val := pcMap["type"]; val != nil { 53 payloadClass.Type = val.(string) 54 } 55 56 return payloadClass 57 } 58 59 // Validate checks the payload class to ensure its data is valid. 60 func (pc PayloadClass) Validate() error { 61 if pc.Name == "" { 62 return fmt.Errorf("payload class missing name") 63 } 64 if !names.IsValidPayload(pc.Name) { 65 return fmt.Errorf("invalid payload class %q", pc.Name) 66 } 67 68 if pc.Type == "" { 69 return fmt.Errorf("payload class missing type") 70 } 71 72 return nil 73 }