13 Order binary.ByteOrder
16 func (o *Options) Validate() error {
23 return fmt.Errorf("Invalid Options.PtrSize: %d. Must be in (8, 16, 32, 64)", o.PtrSize)
29 var emptyOptions = &Options{}
31 func prep(data interface{}) (reflect.Value, Packer, error) {
32 value := reflect.ValueOf(data)
33 for value.Kind() == reflect.Ptr {
34 next := value.Elem().Kind()
35 if next == reflect.Struct || next == reflect.Ptr {
43 fields, err := parseFields(value)
44 return value, fields, err
47 return reflect.Value{}, nil, fmt.Errorf("Invalid reflect.Value for %+v", data)
49 if c, ok := data.(Custom); ok {
50 return value, customFallback{c}, nil
52 return value, binaryFallback(value), nil
56 func Pack(w io.Writer, data interface{}) error {
57 return PackWithOptions(w, data, nil)
60 func PackWithOptions(w io.Writer, data interface{}, options *Options) error {
62 options = emptyOptions
64 if err := options.Validate(); err != nil {
67 val, packer, err := prep(data)
71 if val.Type().Kind() == reflect.String {
72 val = val.Convert(reflect.TypeOf([]byte{}))
74 size := packer.Sizeof(val, options)
75 buf := make([]byte, size)
76 if _, err := packer.Pack(buf, val, options); err != nil {
83 func Unpack(r io.Reader, data interface{}) error {
84 return UnpackWithOptions(r, data, nil)
87 func UnpackWithOptions(r io.Reader, data interface{}, options *Options) error {
89 options = emptyOptions
91 if err := options.Validate(); err != nil {
94 val, packer, err := prep(data)
98 return packer.Unpack(r, val, options)
101 func Sizeof(data interface{}) (int, error) {
102 return SizeofWithOptions(data, nil)
105 func SizeofWithOptions(data interface{}, options *Options) (int, error) {
107 options = emptyOptions
109 if err := options.Validate(); err != nil {
112 val, packer, err := prep(data)
116 return packer.Sizeof(val, options), nil