in internal/typeregistry/registration.go [59:86]
func (t *TypeRegistry) RegisterEnum(fqn api.FQN, enm reflect.Type, members map[string]interface{}) error {
if enm.Kind() != reflect.String {
return fmt.Errorf("the provided enum is not a string derivative: %v", enm)
}
if existing, exists := t.fqnToType[fqn]; exists && existing.Type != enm {
return fmt.Errorf("another type was already registered with %v: %v", fqn, existing)
}
if existing, exists := t.typeToEnumFQN[enm]; exists && existing != fqn {
return fmt.Errorf("attempted to re-register %v as %v, but it was registered as %v", enm, fqn, existing)
}
for memberName, memberVal := range members {
vt := reflect.ValueOf(memberVal).Type()
if vt != enm {
return fmt.Errorf("the enum entry for key %v has incorrect type %v", memberName, vt)
}
// Not setting in t.fqnToEnumMember here so we don't cause any side-effects
// if the pre-condition fails at any point. This is done in a second loop.
}
t.fqnToType[fqn] = registeredType{enm, enumType}
t.typeToEnumFQN[enm] = fqn
for memberName, memberVal := range members {
memberFQN := fmt.Sprintf("%v/%v", fqn, memberName)
t.fqnToEnumMember[memberFQN] = memberVal
}
return nil
}