THRIFT-2159 Serializer/Deserializer for Go
Patch: Justin Judd
diff --git a/lib/go/thrift/deserializer.go b/lib/go/thrift/deserializer.go
new file mode 100644
index 0000000..e7effb1
--- /dev/null
+++ b/lib/go/thrift/deserializer.go
@@ -0,0 +1,39 @@
+package thrift
+
+type TDeserializer struct {
+ Transport TTransport
+ Protocol TProtocol
+}
+
+func NewTDeserializer() *TDeserializer {
+ var transport TTransport
+ transport = NewTMemoryBufferLen(1024)
+
+ protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport)
+
+ return &TDeserializer{
+ transport,
+ protocol}
+}
+
+func (t *TDeserializer) ReadString(msg TStruct, s string) (err error) {
+ err = nil
+ if _, err = t.Transport.Write([]byte(s)); err != nil {
+ return
+ }
+ if err = msg.Read(t.Protocol); err != nil {
+ return
+ }
+ return
+}
+
+func (t *TDeserializer) Read(msg TStruct, b []byte) (err error) {
+ err = nil
+ if _, err = t.Transport.Write(b); err != nil {
+ return
+ }
+ if err = msg.Read(t.Protocol); err != nil {
+ return
+ }
+ return
+}
diff --git a/lib/go/thrift/serializer.go b/lib/go/thrift/serializer.go
new file mode 100644
index 0000000..bb6a2c8
--- /dev/null
+++ b/lib/go/thrift/serializer.go
@@ -0,0 +1,74 @@
+package thrift
+
+type TSerializer struct {
+ Transport TTransport
+ Protocol TProtocol
+}
+
+type TStruct interface {
+ Write(p TProtocol) error
+ Read(p TProtocol) error
+}
+
+func NewTSerializer() *TSerializer {
+ var transport TTransport
+ transport = NewTMemoryBufferLen(1024)
+
+ protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport)
+
+ return &TSerializer{
+ transport,
+ protocol}
+}
+
+func (t *TSerializer) WriteString(msg TStruct) (s string, err error) {
+ s = ""
+ err = nil
+
+ if err = msg.Write(t.Protocol); err != nil {
+ return
+ }
+
+ if err = t.Protocol.Flush(); err != nil {
+ return
+ }
+ if err = t.Transport.Flush(); err != nil {
+ return
+ }
+
+ var buf []byte
+ var place int
+ buf = make([]byte, 1024)
+ if place, err = t.Transport.Read(buf); err != nil {
+ return
+ }
+
+ s = string(buf[:place])
+ return
+}
+
+func (t *TSerializer) Write(msg TStruct) (b []byte, err error) {
+ err = nil
+
+ if err = msg.Write(t.Protocol); err != nil {
+ return
+ }
+
+ if err = t.Protocol.Flush(); err != nil {
+ return
+ }
+
+ if err = t.Transport.Flush(); err != nil {
+ return
+ }
+
+ var buf []byte
+ var place int
+ buf = make([]byte, 1024)
+ if place, err = t.Transport.Read(buf); err != nil {
+ return
+ }
+
+ b = buf[:place]
+ return
+}
diff --git a/lib/go/thrift/serializer_test.go b/lib/go/thrift/serializer_test.go
new file mode 100644
index 0000000..840f6f7
--- /dev/null
+++ b/lib/go/thrift/serializer_test.go
@@ -0,0 +1,150 @@
+package thrift
+
+import (
+ "errors"
+ "fmt"
+ "testing"
+)
+
+type ProtocolFactory interface {
+ GetProtocol(t TTransport) TProtocol
+}
+
+func compareStructs(m, m1 TestStruct) (bool, error) {
+ switch {
+ case m.On != m1.On:
+ return false, errors.New("Boolean not equal")
+ case m.B != m1.B:
+ return false, errors.New("Byte not equal")
+ case m.Int16 != m1.Int16:
+ return false, errors.New("Int16 not equal")
+ case m.Int32 != m1.Int32:
+ return false, errors.New("Int32 not equal")
+ case m.Int64 != m1.Int64:
+ return false, errors.New("Int64 not equal")
+ case m.D != m1.D:
+ return false, errors.New("Double not equal")
+ case m.St != m1.St:
+ return false, errors.New("String not equal")
+
+ case len(m.Bin) != len(m1.Bin):
+ return false, errors.New("Binary size not equal")
+ case len(m.Bin) == len(m1.Bin):
+ for i := range m.Bin {
+ if m.Bin[i] != m1.Bin[i] {
+ return false, errors.New("Binary not equal")
+ }
+ }
+ case len(m.StringMap) != len(m1.StringMap):
+ return false, errors.New("StringMap size not equal")
+ case len(m.StringList) != len(m1.StringList):
+ return false, errors.New("StringList size not equal")
+ case len(m.StringSet) != len(m1.StringSet):
+ return false, errors.New("StringSet size not equal")
+
+ case m.E != m1.E:
+ return false, errors.New("TestEnum not equal")
+
+ default:
+ return true, nil
+
+ }
+ return true, nil
+}
+
+func ProtocolTest1(test *testing.T, pf ProtocolFactory) (bool, error) {
+ t := NewTSerializer()
+ t.Protocol = pf.GetProtocol(t.Transport)
+ var m = TestStruct{}
+ m.On = true
+ m.B = int8(0)
+ m.Int16 = 1
+ m.Int32 = 2
+ m.Int64 = 3
+ m.D = 4.1
+ m.St = "Test"
+ m.Bin = make([]byte, 10)
+ m.StringMap = make(map[string]string, 5)
+ m.StringList = make([]string, 5)
+ m.StringSet = make(map[string]bool, 5)
+ m.E = 2
+
+ s, err := t.WriteString(&m)
+ if err != nil {
+ return false, errors.New(fmt.Sprintf("Unable to Serialize struct\n\t %s", err))
+ }
+
+ t1 := NewTDeserializer()
+ t1.Protocol = pf.GetProtocol(t1.Transport)
+ var m1 = TestStruct{}
+ if err = t1.ReadString(&m1, s); err != nil {
+ return false, errors.New(fmt.Sprintf("Unable to Deserialize struct\n\t %s", err))
+
+ }
+
+ return compareStructs(m, m1)
+
+}
+
+func ProtocolTest2(test *testing.T, pf ProtocolFactory) (bool, error) {
+ t := NewTSerializer()
+ t.Protocol = pf.GetProtocol(t.Transport)
+ var m = TestStruct{}
+ m.On = false
+ m.B = int8(0)
+ m.Int16 = 1
+ m.Int32 = 2
+ m.Int64 = 3
+ m.D = 4.1
+ m.St = "Test"
+ m.Bin = make([]byte, 10)
+ m.StringMap = make(map[string]string, 5)
+ m.StringList = make([]string, 5)
+ m.StringSet = make(map[string]bool, 5)
+ m.E = 2
+
+ s, err := t.WriteString(&m)
+ if err != nil {
+ return false, errors.New(fmt.Sprintf("Unable to Serialize struct\n\t %s", err))
+
+ }
+
+ t1 := NewTDeserializer()
+ t1.Protocol = pf.GetProtocol(t1.Transport)
+ var m1 = TestStruct{}
+ if err = t1.ReadString(&m1, s); err != nil {
+ return false, errors.New(fmt.Sprintf("Unable to Deserialize struct\n\t %s", err))
+
+ }
+
+ return compareStructs(m, m1)
+
+}
+
+func TestSerializer(t *testing.T) {
+
+ var protocol_factories map[string]ProtocolFactory
+ protocol_factories = make(map[string]ProtocolFactory)
+ protocol_factories["Binary"] = NewTBinaryProtocolFactoryDefault()
+ protocol_factories["Compact"] = NewTCompactProtocolFactory()
+ protocol_factories["SimpleJSON"] = NewTSimpleJSONProtocolFactory()
+ protocol_factories["JSON"] = NewTJSONProtocolFactory()
+
+ var tests map[string]func(*testing.T, ProtocolFactory) (bool, error)
+ tests = make(map[string]func(*testing.T, ProtocolFactory) (bool, error))
+ tests["Test 1"] = ProtocolTest1
+ tests["Test 2"] = ProtocolTest2
+ //tests["Test 3"] = ProtocolTest3 // Example of how to add additional tests
+
+ for name, pf := range protocol_factories {
+
+ for test, f := range tests {
+
+ if s, err := f(t, pf); !s || err != nil {
+ t.Errorf("%s Failed for %s protocol\n\t %s", test, name, err)
+ }
+
+ }
+ }
+
+}
diff --git a/lib/go/thrift/serializer_types.go b/lib/go/thrift/serializer_types.go
new file mode 100644
index 0000000..2ce353b
--- /dev/null
+++ b/lib/go/thrift/serializer_types.go
@@ -0,0 +1,578 @@
+package thrift
+
+// Autogenerated by Thrift Compiler (1.0.0-dev)
+// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+
+/* THE FOLLOWING THRIFT FILE WAS USED TO CREATE THIS
+
+enum TestEnum {
+ FIRST = 1,
+ SECOND = 2,
+ THIRD = 3,
+ FOURTH = 4,
+}
+
+struct TestStruct {
+ 1: bool on,
+ 2: byte b,
+ 3: i16 int16,
+ 4: i32 int32,
+ 5: i64 int64,
+ 6: double d,
+ 7: string st,
+ 8: binary bin,
+ 9: map<string, string> stringMap,
+ 10: list<string> stringList,
+ 11: set<string> stringSet,
+ 12: TestEnum e,
+}
+*/
+
+import (
+ "fmt"
+ "math"
+)
+
+// (needed to ensure safety because of naive import list constrution.)
+var _ = math.MinInt32
+var _ = ZERO
+var _ = fmt.Printf
+
+var GoUnusedProtection__ int
+
+type TestEnum int64
+
+const (
+ TestEnum_FIRST TestEnum = 1
+ TestEnum_SECOND TestEnum = 2
+ TestEnum_THIRD TestEnum = 3
+ TestEnum_FOURTH TestEnum = 4
+)
+
+func (p TestEnum) String() string {
+ switch p {
+ case TestEnum_FIRST:
+ return "TestEnum_FIRST"
+ case TestEnum_SECOND:
+ return "TestEnum_SECOND"
+ case TestEnum_THIRD:
+ return "TestEnum_THIRD"
+ case TestEnum_FOURTH:
+ return "TestEnum_FOURTH"
+ }
+ return "<UNSET>"
+}
+
+func TestEnumFromString(s string) (TestEnum, error) {
+ switch s {
+ case "TestEnum_FIRST":
+ return TestEnum_FIRST, nil
+ case "TestEnum_SECOND":
+ return TestEnum_SECOND, nil
+ case "TestEnum_THIRD":
+ return TestEnum_THIRD, nil
+ case "TestEnum_FOURTH":
+ return TestEnum_FOURTH, nil
+ }
+ return TestEnum(math.MinInt32 - 1), fmt.Errorf("not a valid TestEnum string")
+}
+
+type TestStruct struct {
+ On bool `thrift:"on,1"`
+ B int8 `thrift:"b,2"`
+ Int16 int16 `thrift:"int16,3"`
+ Int32 int32 `thrift:"int32,4"`
+ Int64 int64 `thrift:"int64,5"`
+ D float64 `thrift:"d,6"`
+ St string `thrift:"st,7"`
+ Bin []byte `thrift:"bin,8"`
+ StringMap map[string]string `thrift:"stringMap,9"`
+ StringList []string `thrift:"stringList,10"`
+ StringSet map[string]bool `thrift:"stringSet,11"`
+ E TestEnum `thrift:"e,12"`
+}
+
+func NewTestStruct() *TestStruct {
+ return &TestStruct{
+ E: math.MinInt32 - 1, // unset sentinal value
+ }
+}
+
+func (p *TestStruct) IsSetE() bool {
+ return int64(p.E) != math.MinInt32-1
+}
+
+func (p *TestStruct) Read(iprot TProtocol) error {
+ if _, err := iprot.ReadStructBegin(); err != nil {
+ return fmt.Errorf("%T read error %s", p, err)
+ }
+ for {
+ _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+ if err != nil {
+ return fmt.Errorf("%T field %d read error: %s", p, fieldId, err)
+ }
+ if fieldTypeId == STOP {
+ break
+ }
+ switch fieldId {
+ case 1:
+ if err := p.readField1(iprot); err != nil {
+ return err
+ }
+ case 2:
+ if err := p.readField2(iprot); err != nil {
+ return err
+ }
+ case 3:
+ if err := p.readField3(iprot); err != nil {
+ return err
+ }
+ case 4:
+ if err := p.readField4(iprot); err != nil {
+ return err
+ }
+ case 5:
+ if err := p.readField5(iprot); err != nil {
+ return err
+ }
+ case 6:
+ if err := p.readField6(iprot); err != nil {
+ return err
+ }
+ case 7:
+ if err := p.readField7(iprot); err != nil {
+ return err
+ }
+ case 8:
+ if err := p.readField8(iprot); err != nil {
+ return err
+ }
+ case 9:
+ if err := p.readField9(iprot); err != nil {
+ return err
+ }
+ case 10:
+ if err := p.readField10(iprot); err != nil {
+ return err
+ }
+ case 11:
+ if err := p.readField11(iprot); err != nil {
+ return err
+ }
+ case 12:
+ if err := p.readField12(iprot); err != nil {
+ return err
+ }
+ default:
+ if err := iprot.Skip(fieldTypeId); err != nil {
+ return err
+ }
+ }
+ if err := iprot.ReadFieldEnd(); err != nil {
+ return err
+ }
+ }
+ if err := iprot.ReadStructEnd(); err != nil {
+ return fmt.Errorf("%T read struct end error: %s", p, err)
+ }
+ return nil
+}
+
+func (p *TestStruct) readField1(iprot TProtocol) error {
+ if v, err := iprot.ReadBool(); err != nil {
+ return fmt.Errorf("error reading field 1: %s")
+ } else {
+ p.On = v
+ }
+ return nil
+}
+
+func (p *TestStruct) readField2(iprot TProtocol) error {
+ if v, err := iprot.ReadByte(); err != nil {
+ return fmt.Errorf("error reading field 2: %s")
+ } else {
+ p.B = int8(v)
+ }
+ return nil
+}
+
+func (p *TestStruct) readField3(iprot TProtocol) error {
+ if v, err := iprot.ReadI16(); err != nil {
+ return fmt.Errorf("error reading field 3: %s")
+ } else {
+ p.Int16 = v
+ }
+ return nil
+}
+
+func (p *TestStruct) readField4(iprot TProtocol) error {
+ if v, err := iprot.ReadI32(); err != nil {
+ return fmt.Errorf("error reading field 4: %s")
+ } else {
+ p.Int32 = v
+ }
+ return nil
+}
+
+func (p *TestStruct) readField5(iprot TProtocol) error {
+ if v, err := iprot.ReadI64(); err != nil {
+ return fmt.Errorf("error reading field 5: %s")
+ } else {
+ p.Int64 = v
+ }
+ return nil
+}
+
+func (p *TestStruct) readField6(iprot TProtocol) error {
+ if v, err := iprot.ReadDouble(); err != nil {
+ return fmt.Errorf("error reading field 6: %s")
+ } else {
+ p.D = v
+ }
+ return nil
+}
+
+func (p *TestStruct) readField7(iprot TProtocol) error {
+ if v, err := iprot.ReadString(); err != nil {
+ return fmt.Errorf("error reading field 7: %s")
+ } else {
+ p.St = v
+ }
+ return nil
+}
+
+func (p *TestStruct) readField8(iprot TProtocol) error {
+ if v, err := iprot.ReadBinary(); err != nil {
+ return fmt.Errorf("error reading field 8: %s")
+ } else {
+ p.Bin = v
+ }
+ return nil
+}
+
+func (p *TestStruct) readField9(iprot TProtocol) error {
+ _, _, size, err := iprot.ReadMapBegin()
+ if err != nil {
+ return fmt.Errorf("error reading map begin: %s")
+ }
+ p.StringMap = make(map[string]string, size)
+ for i := 0; i < size; i++ {
+ var _key0 string
+ if v, err := iprot.ReadString(); err != nil {
+ return fmt.Errorf("error reading field 0: %s")
+ } else {
+ _key0 = v
+ }
+ var _val1 string
+ if v, err := iprot.ReadString(); err != nil {
+ return fmt.Errorf("error reading field 0: %s")
+ } else {
+ _val1 = v
+ }
+ p.StringMap[_key0] = _val1
+ }
+ if err := iprot.ReadMapEnd(); err != nil {
+ return fmt.Errorf("error reading map end: %s")
+ }
+ return nil
+}
+
+func (p *TestStruct) readField10(iprot TProtocol) error {
+ _, size, err := iprot.ReadListBegin()
+ if err != nil {
+ return fmt.Errorf("error reading list being: %s")
+ }
+ p.StringList = make([]string, 0, size)
+ for i := 0; i < size; i++ {
+ var _elem2 string
+ if v, err := iprot.ReadString(); err != nil {
+ return fmt.Errorf("error reading field 0: %s")
+ } else {
+ _elem2 = v
+ }
+ p.StringList = append(p.StringList, _elem2)
+ }
+ if err := iprot.ReadListEnd(); err != nil {
+ return fmt.Errorf("error reading list end: %s")
+ }
+ return nil
+}
+
+func (p *TestStruct) readField11(iprot TProtocol) error {
+ _, size, err := iprot.ReadSetBegin()
+ if err != nil {
+ return fmt.Errorf("error reading set being: %s")
+ }
+ p.StringSet = make(map[string]bool, size)
+ for i := 0; i < size; i++ {
+ var _elem3 string
+ if v, err := iprot.ReadString(); err != nil {
+ return fmt.Errorf("error reading field 0: %s")
+ } else {
+ _elem3 = v
+ }
+ p.StringSet[_elem3] = true
+ }
+ if err := iprot.ReadSetEnd(); err != nil {
+ return fmt.Errorf("error reading set end: %s")
+ }
+ return nil
+}
+
+func (p *TestStruct) readField12(iprot TProtocol) error {
+ if v, err := iprot.ReadI32(); err != nil {
+ return fmt.Errorf("error reading field 12: %s")
+ } else {
+ p.E = TestEnum(v)
+ }
+ return nil
+}
+
+func (p *TestStruct) Write(oprot TProtocol) error {
+ if err := oprot.WriteStructBegin("TestStruct"); err != nil {
+ return fmt.Errorf("%T write struct begin error: %s", p, err)
+ }
+ if err := p.writeField1(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField2(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField3(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField4(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField5(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField6(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField7(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField8(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField9(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField10(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField11(oprot); err != nil {
+ return err
+ }
+ if err := p.writeField12(oprot); err != nil {
+ return err
+ }
+ if err := oprot.WriteFieldStop(); err != nil {
+ return fmt.Errorf("%T write field stop error: %s", err)
+ }
+ if err := oprot.WriteStructEnd(); err != nil {
+ return fmt.Errorf("%T write struct stop error: %s", err)
+ }
+ return nil
+}
+
+func (p *TestStruct) writeField1(oprot TProtocol) (err error) {
+ if err := oprot.WriteFieldBegin("on", BOOL, 1); err != nil {
+ return fmt.Errorf("%T write field begin error 1:on: %s", p, err)
+ }
+ if err := oprot.WriteBool(bool(p.On)); err != nil {
+ return fmt.Errorf("%T.on (1) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 1:on: %s", p, err)
+ }
+ return err
+}
+
+func (p *TestStruct) writeField2(oprot TProtocol) (err error) {
+ if err := oprot.WriteFieldBegin("b", BYTE, 2); err != nil {
+ return fmt.Errorf("%T write field begin error 2:b: %s", p, err)
+ }
+ if err := oprot.WriteByte(byte(p.B)); err != nil {
+ return fmt.Errorf("%T.b (2) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 2:b: %s", p, err)
+ }
+ return err
+}
+
+func (p *TestStruct) writeField3(oprot TProtocol) (err error) {
+ if err := oprot.WriteFieldBegin("int16", I16, 3); err != nil {
+ return fmt.Errorf("%T write field begin error 3:int16: %s", p, err)
+ }
+ if err := oprot.WriteI16(int16(p.Int16)); err != nil {
+ return fmt.Errorf("%T.int16 (3) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 3:int16: %s", p, err)
+ }
+ return err
+}
+
+func (p *TestStruct) writeField4(oprot TProtocol) (err error) {
+ if err := oprot.WriteFieldBegin("int32", I32, 4); err != nil {
+ return fmt.Errorf("%T write field begin error 4:int32: %s", p, err)
+ }
+ if err := oprot.WriteI32(int32(p.Int32)); err != nil {
+ return fmt.Errorf("%T.int32 (4) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 4:int32: %s", p, err)
+ }
+ return err
+}
+
+func (p *TestStruct) writeField5(oprot TProtocol) (err error) {
+ if err := oprot.WriteFieldBegin("int64", I64, 5); err != nil {
+ return fmt.Errorf("%T write field begin error 5:int64: %s", p, err)
+ }
+ if err := oprot.WriteI64(int64(p.Int64)); err != nil {
+ return fmt.Errorf("%T.int64 (5) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 5:int64: %s", p, err)
+ }
+ return err
+}
+
+func (p *TestStruct) writeField6(oprot TProtocol) (err error) {
+ if err := oprot.WriteFieldBegin("d", DOUBLE, 6); err != nil {
+ return fmt.Errorf("%T write field begin error 6:d: %s", p, err)
+ }
+ if err := oprot.WriteDouble(float64(p.D)); err != nil {
+ return fmt.Errorf("%T.d (6) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 6:d: %s", p, err)
+ }
+ return err
+}
+
+func (p *TestStruct) writeField7(oprot TProtocol) (err error) {
+ if err := oprot.WriteFieldBegin("st", STRING, 7); err != nil {
+ return fmt.Errorf("%T write field begin error 7:st: %s", p, err)
+ }
+ if err := oprot.WriteString(string(p.St)); err != nil {
+ return fmt.Errorf("%T.st (7) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 7:st: %s", p, err)
+ }
+ return err
+}
+
+func (p *TestStruct) writeField8(oprot TProtocol) (err error) {
+ if p.Bin != nil {
+ if err := oprot.WriteFieldBegin("bin", BINARY, 8); err != nil {
+ return fmt.Errorf("%T write field begin error 8:bin: %s", p, err)
+ }
+ if err := oprot.WriteBinary(p.Bin); err != nil {
+ return fmt.Errorf("%T.bin (8) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 8:bin: %s", p, err)
+ }
+ }
+ return err
+}
+
+func (p *TestStruct) writeField9(oprot TProtocol) (err error) {
+ if p.StringMap != nil {
+ if err := oprot.WriteFieldBegin("stringMap", MAP, 9); err != nil {
+ return fmt.Errorf("%T write field begin error 9:stringMap: %s", p, err)
+ }
+ if err := oprot.WriteMapBegin(STRING, STRING, len(p.StringMap)); err != nil {
+ return fmt.Errorf("error writing map begin: %s")
+ }
+ for k, v := range p.StringMap {
+ if err := oprot.WriteString(string(k)); err != nil {
+ return fmt.Errorf("%T. (0) field write error: %s", p)
+ }
+ if err := oprot.WriteString(string(v)); err != nil {
+ return fmt.Errorf("%T. (0) field write error: %s", p)
+ }
+ }
+ if err := oprot.WriteMapEnd(); err != nil {
+ return fmt.Errorf("error writing map end: %s")
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 9:stringMap: %s", p, err)
+ }
+ }
+ return err
+}
+
+func (p *TestStruct) writeField10(oprot TProtocol) (err error) {
+ if p.StringList != nil {
+ if err := oprot.WriteFieldBegin("stringList", LIST, 10); err != nil {
+ return fmt.Errorf("%T write field begin error 10:stringList: %s", p, err)
+ }
+ if err := oprot.WriteListBegin(STRING, len(p.StringList)); err != nil {
+ return fmt.Errorf("error writing list begin: %s")
+ }
+ for _, v := range p.StringList {
+ if err := oprot.WriteString(string(v)); err != nil {
+ return fmt.Errorf("%T. (0) field write error: %s", p)
+ }
+ }
+ if err := oprot.WriteListEnd(); err != nil {
+ return fmt.Errorf("error writing list end: %s")
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 10:stringList: %s", p, err)
+ }
+ }
+ return err
+}
+
+func (p *TestStruct) writeField11(oprot TProtocol) (err error) {
+ if p.StringSet != nil {
+ if err := oprot.WriteFieldBegin("stringSet", SET, 11); err != nil {
+ return fmt.Errorf("%T write field begin error 11:stringSet: %s", p, err)
+ }
+ if err := oprot.WriteSetBegin(STRING, len(p.StringSet)); err != nil {
+ return fmt.Errorf("error writing set begin: %s")
+ }
+ for v, _ := range p.StringSet {
+ if err := oprot.WriteString(string(v)); err != nil {
+ return fmt.Errorf("%T. (0) field write error: %s", p)
+ }
+ }
+ if err := oprot.WriteSetEnd(); err != nil {
+ return fmt.Errorf("error writing set end: %s")
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 11:stringSet: %s", p, err)
+ }
+ }
+ return err
+}
+
+func (p *TestStruct) writeField12(oprot TProtocol) (err error) {
+ if p.IsSetE() {
+ if err := oprot.WriteFieldBegin("e", I32, 12); err != nil {
+ return fmt.Errorf("%T write field begin error 12:e: %s", p, err)
+ }
+ if err := oprot.WriteI32(int32(p.E)); err != nil {
+ return fmt.Errorf("%T.e (12) field write error: %s", p)
+ }
+ if err := oprot.WriteFieldEnd(); err != nil {
+ return fmt.Errorf("%T write field end error 12:e: %s", p, err)
+ }
+ }
+ return err
+}
+
+func (p *TestStruct) String() string {
+ if p == nil {
+ return "<nil>"
+ }
+ return fmt.Sprintf("TestStruct(%+v)", *p)
+}