magefiles/build/components.go (117 lines of code) (raw):

package build import ( "encoding/json" "strconv" ) const ( TypeDockerImage = "Docker image" TypeFile = "File" TypeDockerImageArchive = "Docker image archive" TypeOSBinary = "OS binary" TypeMacOSPackage = "macOS package" ) type Component interface { json.Marshaler json.Unmarshaler Value() string Type() string Description() string Required() bool WithDescription(string) Component WithRequired() Component } type component struct { value string typ string description string required bool } func (c *component) Value() string { return c.value } func (c *component) Type() string { return c.typ } func (c *component) MarshalJSON() ([]byte, error) { return json.Marshal(map[string]string{ "Value": c.value, "Type": c.typ, }) } func (c *component) UnmarshalJSON(b []byte) error { var m map[string]string if err := json.Unmarshal(b, &m); err != nil { return err } c.value = m["Value"] c.typ = m["Type"] c.description = m["Description"] c.required, _ = strconv.ParseBool(m["Required"]) return nil } func (c *component) Description() string { return c.description } func (c *component) Required() bool { return c.required } func (c *component) WithDescription(description string) Component { c.description = description return c } func (c *component) WithRequired() Component { c.required = true return c } func NewComponent(value, typ, description string, required bool) Component { var comp Component switch typ { case TypeDockerImageArchive: comp = NewDockerImageArchive(value) case TypeDockerImage: comp = NewDockerImage(value) case TypeFile: comp = NewFile(value) case TypeOSBinary: comp = NewOSBinary(value) case TypeMacOSPackage: comp = NewMacOSPackage(value) default: panic("Invalid component type " + typ) } comp = comp.WithDescription(description) if required { comp = comp.WithRequired() } return comp } func NewDockerImage(value string) Component { return &component{ value: value, typ: TypeDockerImage, } } func NewDockerImageArchive(value string) Component { return &component{ value: value, typ: TypeDockerImageArchive, } } func NewFile(value string) Component { return &component{ value: value, typ: TypeFile, } } func NewOSBinary(value string) Component { return &component{ value: value, typ: TypeOSBinary, } } func NewMacOSPackage(value string) Component { return &component{ value: value, typ: TypeMacOSPackage, } }