github.com/chrislusf/greenpack@v3.7.1-0.20170911073826-ad5bd10b7c47+incompatible/cmd/addzid/old_bambam_tests/nested_test.go (about) 1 package main 2 3 import ( 4 "testing" 5 6 cv "github.com/glycerine/goconvey/convey" 7 ) 8 9 func TestNestedStructs016(t *testing.T) { 10 11 cv.Convey("Given go structs that contain structs \n"+ 12 " then these should marshal and unmarshal their inner struct members", t, func() { 13 14 ex0 := ` 15 type Inner struct { 16 C int 17 } 18 type Outer struct { 19 A int 20 B Inner 21 } 22 ` 23 cv.So(ExtractString2String(ex0), ShouldMatchModuloWhiteSpace, ` 24 struct InnerCapn { 25 c @0: Int64; 26 } 27 28 struct OuterCapn { 29 a @0: Int64; b @1: InnerCapn; 30 } 31 32 func (s *Inner) Save(w io.Writer) error { 33 seg := capn.NewBuffer(nil) 34 InnerGoToCapn(seg, s) 35 _, err := seg.WriteTo(w) 36 return err 37 } 38 39 40 41 func (s *Inner) Load(r io.Reader) error { 42 capMsg, err := capn.ReadFromStream(r, nil) 43 if err != nil { 44 //panic(fmt.Errorf("capn.ReadFromStream error: %s", err)) 45 return err 46 } 47 z := ReadRootInnerCapn(capMsg) 48 InnerCapnToGo(z, s) 49 return nil 50 } 51 52 53 54 func InnerCapnToGo(src InnerCapn, dest *Inner) *Inner { 55 if dest == nil { 56 dest = &Inner{} 57 } 58 dest.C = int(src.C()) 59 60 return dest 61 } 62 63 64 65 func InnerGoToCapn(seg *capn.Segment, src *Inner) InnerCapn { 66 dest := AutoNewInnerCapn(seg) 67 dest.SetC(int64(src.C)) 68 69 return dest 70 } 71 72 73 74 func (s *Outer) Save(w io.Writer) error { 75 seg := capn.NewBuffer(nil) 76 OuterGoToCapn(seg, s) 77 _, err := seg.WriteTo(w) 78 return err 79 } 80 81 82 83 func (s *Outer) Load(r io.Reader) error { 84 capMsg, err := capn.ReadFromStream(r, nil) 85 if err != nil { 86 //panic(fmt.Errorf("capn.ReadFromStream error: %s", err)) 87 return err 88 } 89 z := ReadRootOuterCapn(capMsg) 90 OuterCapnToGo(z, s) 91 return nil 92 } 93 94 95 96 func OuterCapnToGo(src OuterCapn, dest *Outer) *Outer { 97 if dest == nil { 98 dest = &Outer{} 99 } 100 dest.A = int(src.A()) 101 dest.B = *InnerCapnToGo(src.B(), nil) 102 103 return dest 104 } 105 106 107 108 func OuterGoToCapn(seg *capn.Segment, src *Outer) OuterCapn { 109 dest := AutoNewOuterCapn(seg) 110 dest.SetA(int64(src.A)) 111 dest.SetB(InnerGoToCapn(seg, &src.B)) 112 113 return dest 114 } 115 `) 116 }) 117 }