1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package schema
- import (
- "github.com/seaweedfs/seaweedfs/weed/pb/schema_pb"
- "reflect"
- )
- func StructToSchema(instance any) *schema_pb.RecordType {
- myType := reflect.TypeOf(instance)
- if myType.Kind() != reflect.Struct {
- return nil
- }
- st := reflectTypeToSchemaType(myType)
- return st.GetRecordType()
- }
- 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 TypeInt32
- case reflect.Int64:
- return TypeInt64
- 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,
- },
- },
- }
- }
- }
- case reflect.Struct:
- recordType := &schema_pb.RecordType{}
- for i := 0; i < t.NumField(); i++ {
- field := t.Field(i)
- fieldType := field.Type
- fieldName := field.Name
- schemaField := reflectTypeToSchemaType(fieldType)
- if schemaField == nil {
- return nil
- }
- recordType.Fields = append(recordType.Fields, &schema_pb.Field{
- Name: fieldName,
- Type: schemaField,
- })
- }
- return &schema_pb.Type{
- Kind: &schema_pb.Type_RecordType{
- RecordType: recordType,
- },
- }
- }
- return nil
- }
|