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  }