func/pkg/builders/builders.go

108 lines
2.6 KiB
Go

/*
Package builders provides constants for builder implementation short names,
shared error types and convienience functions.
*/
package builders
import (
"fmt"
"strconv"
"strings"
fn "knative.dev/func/pkg/functions"
)
const (
Host = "host"
Pack = "pack"
S2I = "s2i"
Default = Pack
)
// Known builder names with a pretty-printed string representation
type Known []string
func All() Known {
return Known([]string{Host, Pack, S2I})
}
func (k Known) String() string {
var b strings.Builder
for i, v := range k {
if i < len(k)-2 {
b.WriteString(strconv.Quote(v) + ", ")
} else if i < len(k)-1 {
b.WriteString(strconv.Quote(v) + " and ")
} else {
b.WriteString(strconv.Quote(v))
}
}
return b.String()
}
// ErrUnknownBuilder may be used by whomever is choosing a concrete
// implementation of a builder to invoke based on potentially invalid input.
type ErrUnknownBuilder struct {
Name string
Known Known
}
func (e ErrUnknownBuilder) Error() string {
if len(e.Known) == 0 {
return fmt.Sprintf("\"%v\" is not a known builder", e.Name)
}
if len(e.Known) == 1 {
return fmt.Sprintf("\"%v\" is not a known builder. The available builder is %v", e.Name, e.Known)
}
return fmt.Sprintf("\"%v\" is not a known builder. Available builders are %s", e.Name, e.Known)
}
// ErrBuilderNotSupported
type ErrBuilderNotSupported struct {
Builder string
}
func (e ErrBuilderNotSupported) Error() string {
return fmt.Sprintf("builder %q is not supported", e.Builder)
}
// ErrRuntimeRequired
type ErrRuntimeRequired struct {
Builder string
}
func (e ErrRuntimeRequired) Error() string {
return fmt.Sprintf("runtime required to choose a default '%v' builder image", e.Builder)
}
// ErrNoDefaultImage
type ErrNoDefaultImage struct {
Builder string
Runtime string
}
func (e ErrNoDefaultImage) Error() string {
return fmt.Sprintf("the '%v' runtime defines no default '%v' builder image", e.Runtime, e.Builder)
}
// Image is a convenience function for choosing the correct builder image
// given a function, a builder, and defaults grouped by runtime.
// - ErrRuntimeRequired if no runtime was provided on the given function
// - ErrNoDefaultImage if the function has no builder image already defined
// for the given runtime and there is no default in the provided map.
func Image(f fn.Function, builder string, defaults map[string]string) (string, error) {
v, ok := f.Build.BuilderImages[builder]
if ok {
return v, nil // found value
}
if f.Runtime == "" {
return "", ErrRuntimeRequired{Builder: builder}
}
v, ok = defaults[f.Runtime]
if ok {
return v, nil // Found default
}
return "", ErrNoDefaultImage{Builder: builder, Runtime: f.Runtime}
}