Skip to content

Commit

Permalink
refactor: Easier diff
Browse files Browse the repository at this point in the history
  • Loading branch information
erezrokah committed Jul 23, 2024
1 parent a0b04e4 commit 8c9b343
Showing 1 changed file with 66 additions and 66 deletions.
132 changes: 66 additions & 66 deletions transformers/struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,72 +143,6 @@ func normalizePointer(field reflect.StructField) reflect.Value {
return reflect.New(field.Type)
}

func (t *structTransformer) fieldToJSONSchema(field reflect.StructField, depth int) any {
transformInput := normalizePointer(field)
switch transformInput.Elem().Kind() {
case reflect.Struct:
fieldsMap := make(map[string]any)
fieldType := transformInput.Elem().Type()
for i := 0; i < fieldType.NumField(); i++ {
name, err := t.nameTransformer(fieldType.Field(i))
if err != nil {
continue
}
columnType, err := t.getColumnType(fieldType.Field(i))
if err != nil {
continue
}
if columnType == nil {
fieldsMap[name] = "any"
continue
}
if columnType == types.ExtensionTypes.JSON && depth < maxJSONTypeSchemaDepth {
fieldsMap[name] = t.fieldToJSONSchema(fieldType.Field(i), depth+1)
continue
}
if arrow.IsListLike(columnType.ID()) {
fieldsMap[name] = []any{columnType.(*arrow.ListType).Elem().String()}
continue
}
fieldsMap[name] = columnType.String()
}
return fieldsMap
case reflect.Map:
keySchema, ok := t.fieldToJSONSchema(reflect.StructField{
Type: field.Type.Key(),
}, depth+1).(string)
if keySchema == "" || !ok {
return ""
}
valueSchema := t.fieldToJSONSchema(reflect.StructField{
Type: field.Type.Elem(),
}, depth+1)
if valueSchema == "" {
return ""
}
return map[string]any{
keySchema: valueSchema,
}
case reflect.Slice:
valueSchema := t.fieldToJSONSchema(reflect.StructField{
Type: field.Type.Elem(),
}, depth+1)
if valueSchema == "" {
return ""
}
return []any{valueSchema}
}

columnType, err := t.getColumnType(field)
if err != nil {
return ""
}
if columnType == nil {
return "any"
}
return columnType.String()
}

func (t *structTransformer) addColumnFromField(field reflect.StructField, parent *reflect.StructField) error {
if t.ignoreField(field) {
return nil
Expand Down Expand Up @@ -335,3 +269,69 @@ func TransformWithStruct(st any, opts ...StructTransformerOption) schema.Transfo
return nil
}
}

func (t *structTransformer) fieldToJSONSchema(field reflect.StructField, depth int) any {
transformInput := normalizePointer(field)
switch transformInput.Elem().Kind() {
case reflect.Struct:
fieldsMap := make(map[string]any)
fieldType := transformInput.Elem().Type()
for i := 0; i < fieldType.NumField(); i++ {
name, err := t.nameTransformer(fieldType.Field(i))
if err != nil {
continue
}
columnType, err := t.getColumnType(fieldType.Field(i))
if err != nil {
continue
}
if columnType == nil {
fieldsMap[name] = "any"
continue
}
if columnType == types.ExtensionTypes.JSON && depth < maxJSONTypeSchemaDepth {
fieldsMap[name] = t.fieldToJSONSchema(fieldType.Field(i), depth+1)
continue
}
if arrow.IsListLike(columnType.ID()) {
fieldsMap[name] = []any{columnType.(*arrow.ListType).Elem().String()}
continue
}
fieldsMap[name] = columnType.String()
}
return fieldsMap
case reflect.Map:
keySchema, ok := t.fieldToJSONSchema(reflect.StructField{
Type: field.Type.Key(),
}, depth+1).(string)
if keySchema == "" || !ok {
return ""
}
valueSchema := t.fieldToJSONSchema(reflect.StructField{
Type: field.Type.Elem(),
}, depth+1)
if valueSchema == "" {
return ""
}
return map[string]any{
keySchema: valueSchema,
}
case reflect.Slice:
valueSchema := t.fieldToJSONSchema(reflect.StructField{
Type: field.Type.Elem(),
}, depth+1)
if valueSchema == "" {
return ""
}
return []any{valueSchema}
}

columnType, err := t.getColumnType(field)
if err != nil {
return ""
}
if columnType == nil {
return "any"
}
return columnType.String()
}

0 comments on commit 8c9b343

Please sign in to comment.