github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/pkg/project/registry.go (about) 1 package project 2 3 import ( 4 "strings" 5 6 "github.com/ActiveState/cli/internal/errs" 7 ) 8 9 // expanderRegistry maps category names to their Expander Func implementations. 10 var expanderRegistry = map[string]ExpanderFunc{} 11 12 var ( 13 ErrExpandBadName = errs.New("Bad expander name") 14 ErrExpandNoFunc = errs.New("Expander has no handler") 15 ) 16 17 const TopLevelExpanderName = "toplevel" 18 19 func init() { 20 expanderRegistry = map[string]ExpanderFunc{ 21 "events": EventExpander, 22 "scripts": ScriptExpander, 23 "constants": ConstantExpander, 24 "project": ProjectExpander, 25 TopLevelExpanderName: TopLevelExpander, 26 } 27 } 28 29 // RegisterExpander registers an Expander Func for some given handler value. The handler value 30 // must not effectively be a blank string and the Func must be defined. It is definitely possible 31 // to replace an existing handler using this function. 32 func RegisterExpander(handle string, expanderFn ExpanderFunc) error { 33 cleanHandle := strings.TrimSpace(handle) 34 if cleanHandle == "" { 35 return errs.Wrap(ErrExpandBadName, "secrets_expander_err_empty_name") 36 } else if expanderFn == nil { 37 return errs.Wrap(ErrExpandNoFunc, "secrets_expander_err_undefined") 38 } 39 expanderRegistry[cleanHandle] = expanderFn 40 return nil 41 } 42 43 // RegisteredExpander returns the expander registered for the given handle 44 func RegisteredExpander(handle string) ExpanderFunc { 45 if expander, ok := expanderRegistry[handle]; ok { 46 return expander 47 } 48 return nil 49 } 50 51 // IsRegistered returns true if an Expander Func is registered for a given handle/name. 52 func IsRegistered(handle string) bool { 53 _, ok := expanderRegistry[handle] 54 return ok 55 }