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  }