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