github.com/protolambda/zssz@v0.1.5/types/factory.go (about) 1 package types 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 type SSZFactoryFn func(typ reflect.Type) (SSZ, error) 9 10 // The default SSZ factory 11 func SSZFactory(typ reflect.Type) (SSZ, error) { 12 return DefaultSSZFactory(SSZFactory, typ) 13 } 14 15 func DefaultSSZFactory(factory SSZFactoryFn, typ reflect.Type) (SSZ, error) { 16 switch typ.Kind() { 17 case reflect.Ptr: 18 return NewSSZPtr(factory, typ) 19 case reflect.Bool: 20 return SSZBool{}, nil 21 case reflect.Uint8: 22 return SSZUint8{}, nil 23 case reflect.Uint16: 24 return SSZUint16{}, nil 25 case reflect.Uint32: 26 return SSZUint32{}, nil 27 case reflect.Uint64: 28 return SSZUint64{}, nil 29 case reflect.Struct: 30 return NewSSZContainer(factory, typ) 31 case reflect.Array: 32 switch typ.Elem().Kind() { 33 case reflect.Uint8: 34 ptrTyp := reflect.PtrTo(typ) 35 if ptrTyp.Implements(bitvectorMeta) { 36 return NewSSZBitvector(typ) 37 } else { 38 return NewSSZBytesN(typ) 39 } 40 case reflect.Bool, reflect.Uint16, reflect.Uint32, reflect.Uint64: 41 return NewSSZBasicVector(typ) 42 default: 43 return NewSSZVector(factory, typ) 44 } 45 case reflect.Slice: 46 switch typ.Elem().Kind() { 47 case reflect.Uint8: 48 ptrTyp := reflect.PtrTo(typ) 49 if ptrTyp.Implements(bitlistMeta) { 50 return NewSSZBitlist(typ) 51 } else { 52 return NewSSZBytes(typ) 53 } 54 case reflect.Bool, reflect.Uint16, reflect.Uint32, reflect.Uint64: 55 return NewSSZBasicList(typ) 56 default: 57 return NewSSZList(factory, typ) 58 } 59 // TODO: union, null, uint128, uint256, string 60 default: 61 return nil, fmt.Errorf("ssz: type %s cannot be recognized", typ.String()) 62 } 63 }