chrislu
8 months ago
2 changed files with 63 additions and 8 deletions
@ -0,0 +1,55 @@ |
|||
package schema |
|||
|
|||
import ( |
|||
"github.com/seaweedfs/seaweedfs/weed/pb/schema_pb" |
|||
"reflect" |
|||
) |
|||
|
|||
func StructToSchema(instance any) *RecordTypeBuilder { |
|||
rtb := NewRecordTypeBuilder() |
|||
myType := reflect.TypeOf(instance) |
|||
for i := 0; i < myType.NumField(); i++ { |
|||
field := myType.Field(i) |
|||
fieldType := field.Type |
|||
fieldName := field.Name |
|||
schemaField := reflectTypeToSchemaType(fieldType) |
|||
if schemaField == nil { |
|||
continue |
|||
} |
|||
rtb.setField(fieldName, schemaField) |
|||
} |
|||
return rtb |
|||
} |
|||
|
|||
func reflectTypeToSchemaType(t reflect.Type) *schema_pb.Type { |
|||
switch t.Kind() { |
|||
case reflect.Bool: |
|||
return TypeBoolean |
|||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32: |
|||
return TypeInteger |
|||
case reflect.Int64: |
|||
return TypeLong |
|||
case reflect.Float32: |
|||
return TypeFloat |
|||
case reflect.Float64: |
|||
return TypeDouble |
|||
case reflect.String: |
|||
return TypeString |
|||
case reflect.Slice: |
|||
switch t.Elem().Kind() { |
|||
case reflect.Uint8: |
|||
return TypeBytes |
|||
default: |
|||
if st := reflectTypeToSchemaType(t.Elem()); st != nil { |
|||
return &schema_pb.Type{ |
|||
Kind: &schema_pb.Type_ListType{ |
|||
ListType: &schema_pb.ListType{ |
|||
ElementType: st, |
|||
}, |
|||
}, |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return nil |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue