@@ -114,38 +114,40 @@ func TestStructFieldHelpers(t *testing.T) {
114114			})
115115
116116			t .Run ("DecodeStructFields" , func (t  * testing.T ) {
117+ 				s  :=  NewStream (bytes .NewReader (wantRLP ), 0 )
117118				var  got  foo 
118- 				err  :=  DecodeStructFields (
119- 					bytes .NewReader (wantRLP ),
119+ 				err  :=  s .DecodeStructFields (
120120					[]any {& got .A , & got .B , & got .C },
121121					[]any {& got .D , & got .E , & got .F },
122122				)
123- 				require .NoError (t , err , "DecodeStructFields(...)" )
123+ 				require .NoError (t , err , "Stream. DecodeStructFields(...)" )
124124
125125				var  want  foo 
126126				err  =  DecodeBytes (wantRLP , & want )
127127				require .NoError (t , err , "DecodeBytes(...)" )
128128
129- 				assert .Equal (t , want , got , "DecodeBytes(..., [original struct]) vs DecodeStructFields(...)" )
129+ 				assert .Equal (t , want , got , "DecodeBytes(..., [original struct]) vs Stream. DecodeStructFields(...)" )
130130			})
131131		})
132132	}
133133}
134134
135135//nolint:testableexamples // Demonstrating code equivalence, not outputs. 
136- func  ExampleDecodeStructFields () {
136+ func  ExampleStream_DecodeStructFields () {
137137	type  inner  struct  {
138138		X  uint64 
139139	}
140140
141141	type  outer  struct  {
142142		A  uint64 
143- 		B  * inner  `rlp:"optional"` 
143+ 		B  * inner  `rlp:"nil"` 
144+ 		C  * inner  `rlp:"optional"` 
144145	}
145146
146147	val  :=  outer {
147148		A : 42 ,
148- 		B : & inner {X : 99 },
149+ 		B : & inner {X : 42 },
150+ 		C : & inner {X : 99 },
149151	}
150152
151153	// Errors are dropped for brevity for the sake of the example only. 
@@ -154,24 +156,26 @@ func ExampleDecodeStructFields() {
154156	// is equivalent to 
155157	_  =  EncodeStructFields (
156158		io .Discard ,
157- 		[]any {val .A },
158- 		[]any {val .B },
159+ 		[]any {val .A ,  val . B },
160+ 		[]any {val .C },
159161	)
160162
161163	r  :=  bytes .NewReader (nil  /*arbitrary RLP buffer*/ )
162164	var  decoded  outer 
163165	_  =  Decode (r , & decoded )
164166	// is equivalent to 
165- 	_  =  DecodeStructFields (
166- 		r ,
167- 		[]any {& val .A },
168- 		[]any {& val .B },
167+ 	_  =  NewStream (r , 0 ).DecodeStructFields (
168+ 		[]any {
169+ 			& val .A ,
170+ 			Nillable (& val .B ),
171+ 		},
172+ 		[]any {& val .C },
169173	)
170174
171175	// Note the parallels between the arguments passed to 
172- 	// {En,De}codeStructFields() and that, when decoding an optional field, a  
173- 	// pointer to the _field_ is required even though in this example it will be  
174- 	// a `**inner`. 
176+ 	// {En,De}codeStructFields() and that, when decoding an optional or  
177+ 	// `rlp:"nil`-tagged field, a  pointer to the _field_ is required even though 
178+ 	// in this example it will be  a `**inner`. 
175179}
176180
177181func  TestNillable (t  * testing.T ) {
@@ -218,19 +222,19 @@ func TestNillable(t *testing.T) {
218222			err  =  DecodeBytes (rlp , & want )
219223			require .NoErrorf (t , err , "DecodeBytes(%#x, %T)" , rlp , & want )
220224
225+ 			s  :=  NewStream (bytes .NewReader (rlp ), 0 )
221226			got  :=  corruptInitialValue ()
222- 			err  =  DecodeStructFields (
223- 				bytes .NewReader (rlp ),
227+ 			err  =  s .DecodeStructFields (
224228				[]any {
225229					Nillable (& got .A ),
226230					Nillable (& got .B ),
227231					Nillable (& got .C ),
228232				},
229233				nil ,
230234			)
231- 			require .NoError (t , err , "DecodeStructFields(...)" )
235+ 			require .NoError (t , err , "Stream. DecodeStructFields(...)" )
232236
233- 			assert .Equal (t , want , got , "DecodeBytes(...) vs DecodeStructFields(... )" )
237+ 			assert .Equal (t , want , got , "DecodeBytes(...) vs Stream. DecodeStructFields([fields wrapped in Nillable()] )" )
234238		})
235239	}
236240}
0 commit comments