func()

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
}