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
							 | 
						|
								}
							 |