package scaffolding

type Signature int

const (
	UnknownSignature Signature = iota
	InstancedHTTP
	InstancedCloudevents
	StaticHTTP
	StaticCloudevents
)

func (s Signature) String() string {
	return []string{
		"unknown",
		"instanced-http",
		"instanced-cloudevents",
		"static-http",
		"static-cloudevents",
	}[s]
}

// Note that in all places other than the invocation hint (where singular
// is logically correct) "cloudevents" is plural in all places (variables,
// imports, enums etc) to match the Cloudevents library and organization's
// choice.
// signatureMap
var signatureMap = map[bool]map[string]Signature{
	true: { // Instanced
		"http":       InstancedHTTP,
		"cloudevent": InstancedCloudevents},
	false: { // !Instanced
		"http":       StaticHTTP,
		"cloudevent": StaticCloudevents},
}

// toSignature converts an instanced boolean and invocation hint into
// a Signature enum.
func toSignature(instanced bool, invoke string) Signature {
	if invoke == "" {
		invoke = "http"
	}
	s, ok := signatureMap[instanced][invoke]
	if !ok {
		return UnknownSignature
	}
	return s
}
