in internal/typeregistry/registration.go [114:147]
func (t *TypeRegistry) RegisterStruct(fqn api.FQN, strct reflect.Type) error {
if strct.Kind() != reflect.Struct {
return fmt.Errorf("the provided struct is not a struct: %v", strct)
}
if existing, exists := t.fqnToType[fqn]; exists && existing.Type != strct {
return fmt.Errorf("another type was already registered with %s: %v", fqn, existing)
}
if existing, exists := t.structInfo[strct]; exists && existing.FQN != fqn {
return fmt.Errorf("attempting to register type %s as %s, but it was already registered as: %s", strct.String(), fqn, existing.FQN)
}
numField := strct.NumField()
fields := make([]reflect.StructField, 0, numField)
for i := 0; i < numField; i++ {
field := strct.Field(i)
if field.Anonymous {
return fmt.Errorf("unexpected anonymous field %v in struct %s (%v)", field, fqn, strct)
}
if field.PkgPath != "" {
return fmt.Errorf("unexpected un-exported field %v in struct %s (%v)", field, fqn, strct)
}
if field.Tag.Get("json") == "" {
return fmt.Errorf("missing json tag on struct field %v of %s (%v)", field, fqn, strct)
}
fields = append(fields, field)
}
t.fqnToType[fqn] = registeredType{strct, structType}
t.structInfo[strct] = registeredStruct{FQN: fqn, Fields: fields}
return nil
}