You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							68 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							68 lines
						
					
					
						
							1.5 KiB
						
					
					
				| 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 | |
| }
 |