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.

55 lines
1.2 KiB

  1. package schema
  2. import (
  3. "github.com/seaweedfs/seaweedfs/weed/pb/schema_pb"
  4. "reflect"
  5. )
  6. func StructToSchema(instance any) *RecordTypeBuilder {
  7. rtb := NewRecordTypeBuilder()
  8. myType := reflect.TypeOf(instance)
  9. for i := 0; i < myType.NumField(); i++ {
  10. field := myType.Field(i)
  11. fieldType := field.Type
  12. fieldName := field.Name
  13. schemaField := reflectTypeToSchemaType(fieldType)
  14. if schemaField == nil {
  15. continue
  16. }
  17. rtb.setField(fieldName, schemaField)
  18. }
  19. return rtb
  20. }
  21. func reflectTypeToSchemaType(t reflect.Type) *schema_pb.Type {
  22. switch t.Kind() {
  23. case reflect.Bool:
  24. return TypeBoolean
  25. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32:
  26. return TypeInteger
  27. case reflect.Int64:
  28. return TypeLong
  29. case reflect.Float32:
  30. return TypeFloat
  31. case reflect.Float64:
  32. return TypeDouble
  33. case reflect.String:
  34. return TypeString
  35. case reflect.Slice:
  36. switch t.Elem().Kind() {
  37. case reflect.Uint8:
  38. return TypeBytes
  39. default:
  40. if st := reflectTypeToSchemaType(t.Elem()); st != nil {
  41. return &schema_pb.Type{
  42. Kind: &schema_pb.Type_ListType{
  43. ListType: &schema_pb.ListType{
  44. ElementType: st,
  45. },
  46. },
  47. }
  48. }
  49. }
  50. }
  51. return nil
  52. }