func WriteTuple(w *marshal.Writer, i interface{}) { switch o := i.(type) { case nil: return case uint8: w.Uint32(1) w.Uint8(1) w.Uint8(o) case int8: w.Uint32(1) w.Uint8(1) w.Int8(o) case uint16: w.Uint32(1) w.Uint8(2) w.Uint16(o) case int16: w.Uint32(1) w.Uint8(2) w.Int16(o) case uint32: w.Uint32(1) w.Uint8(4) w.Uint32(o) case int32: w.Uint32(1) w.Uint8(4) w.Int32(o) case uint64: w.Uint32(1) w.Uint8(8) w.Uint64(o) case int64: w.Uint32(1) w.Uint8(8) w.Int64(o) case float32: w.Uint32(1) w.Uint8(4) w.Float32(o) case float64: w.Uint32(1) w.Uint8(8) w.Float64(o) case string: w.Uint32(1) w.Intvar(len(o)) w.String(o) case []byte: w.Uint32(1) w.Intvar(len(o)) w.Bytes(o) case []interface{}: w.IntUint32(len(o)) for _, v := range o { w.WriteWithSize(v, (*marshal.Writer).Intvar) } default: val := reflect.ValueOf(i) rt := val.Type() wr := writer(rt) wr.Write(w, val) } return }