@@ -194,50 +194,68 @@ pub struct TransactionAddress {
194194}
195195
196196
197- #[ derive( Clone , Debug , PartialEq , RlpEncodableWrapper , RlpDecodableWrapper ) ]
198- pub struct ParcelInvoices {
199- pub invoices : Vec < Invoice > ,
197+ #[ derive( Clone , Debug , PartialEq , Serialize ) ]
198+ #[ serde( untagged) ]
199+ pub enum ParcelInvoice {
200+ Single ( Invoice ) ,
201+ Multiple ( Vec < Invoice > ) ,
200202}
201203
202- impl ParcelInvoices {
204+ impl ParcelInvoice {
203205 pub fn new ( invoices : Vec < Invoice > ) -> Self {
204- Self {
205- invoices,
206+ ParcelInvoice :: Multiple ( invoices)
207+ }
208+
209+ pub fn iter < ' a > ( & ' a self ) -> Box < :: std:: iter:: Iterator < Item = & ' a Invoice > + ' a > {
210+ match self {
211+ ParcelInvoice :: Single ( invoice) => Box :: new ( :: std:: iter:: once ( invoice) ) ,
212+ ParcelInvoice :: Multiple ( invoices) => Box :: new ( invoices. iter ( ) ) ,
206213 }
207214 }
215+ }
208216
209- pub fn iter ( & self ) -> :: std:: slice:: Iter < Invoice > {
210- self . invoices . iter ( )
217+ impl Encodable for ParcelInvoice {
218+ fn rlp_append ( & self , s : & mut RlpStream ) {
219+ match self {
220+ ParcelInvoice :: Single ( invoice) => {
221+ s. append ( invoice) ;
222+ }
223+ ParcelInvoice :: Multiple ( invoices) => {
224+ s. append_list ( invoices) ;
225+ }
226+ }
211227 }
212228}
213229
214- impl Into < Vec < Invoice > > for ParcelInvoices {
215- fn into ( self ) -> Vec < Invoice > {
216- self . invoices
230+ impl Decodable for ParcelInvoice {
231+ fn decode ( rlp : & UntrustedRlp ) -> Result < ParcelInvoice , DecoderError > {
232+ Ok ( if rlp. is_list ( ) {
233+ ParcelInvoice :: Multiple ( rlp. as_list ( ) ?)
234+ } else {
235+ ParcelInvoice :: Single ( rlp. as_val ( ) ?)
236+ } )
217237 }
218238}
219239
220- impl < ' a > Into < & ' a Vec < Invoice > > for & ' a ParcelInvoices {
221- fn into ( self ) -> & ' a Vec < Invoice > {
222- & self . invoices
240+ impl Into < Vec < Invoice > > for ParcelInvoice {
241+ fn into ( self ) -> Vec < Invoice > {
242+ self . iter ( ) . cloned ( ) . collect ( )
223243 }
224244}
225245
226- impl From < Vec < Invoice > > for ParcelInvoices {
246+ impl From < Vec < Invoice > > for ParcelInvoice {
227247 fn from ( invoices : Vec < Invoice > ) -> Self {
228- Self {
229- invoices,
230- }
248+ ParcelInvoice :: Multiple ( invoices)
231249 }
232250}
233251
234252#[ derive( Clone , Debug , PartialEq ) ]
235253pub struct BlockInvoices {
236- pub invoices : Vec < ParcelInvoices > ,
254+ pub invoices : Vec < ParcelInvoice > ,
237255}
238256
239257impl BlockInvoices {
240- pub fn new ( invoices : Vec < ParcelInvoices > ) -> Self {
258+ pub fn new ( invoices : Vec < ParcelInvoice > ) -> Self {
241259 Self {
242260 invoices,
243261 }
@@ -248,7 +266,7 @@ impl Decodable for BlockInvoices {
248266 fn decode ( rlp : & UntrustedRlp ) -> Result < Self , DecoderError > {
249267 let invoices = rlp. as_list :: < Vec < u8 > > ( ) ?
250268 . iter ( )
251- . map ( |parcel_invoices | UntrustedRlp :: new ( & parcel_invoices ) . as_val :: < ParcelInvoices > ( ) )
269+ . map ( |parcel_invoice | UntrustedRlp :: new ( & parcel_invoice ) . as_val :: < ParcelInvoice > ( ) )
252270 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
253271 Ok ( Self {
254272 invoices,
@@ -279,7 +297,7 @@ mod tests {
279297 use rlp:: { Encodable , UntrustedRlp } ;
280298
281299 #[ test]
282- fn rlp_encode_and_decode_parcel_invoices ( ) {
300+ fn rlp_encode_and_decode_parcel_invoice ( ) {
283301 let invoices = vec ! [
284302 Invoice :: Success ,
285303 Invoice :: Success ,
@@ -288,33 +306,100 @@ mod tests {
288306 Invoice :: Success ,
289307 Invoice :: Success ,
290308 ] ;
291- let parcel_invoices = ParcelInvoices {
292- invoices,
293- } ;
294- let rlp_encoded = parcel_invoices. rlp_bytes ( ) ;
309+ let parcel_invoice = ParcelInvoice :: new ( invoices) ;
310+ let rlp_encoded = parcel_invoice. rlp_bytes ( ) ;
295311 let stream = UntrustedRlp :: new ( & rlp_encoded) ;
296312 let rlp_decoded = stream. as_val ( ) ;
297- assert_eq ! ( Ok ( parcel_invoices ) , rlp_decoded) ;
313+ assert_eq ! ( Ok ( parcel_invoice ) , rlp_decoded) ;
298314 }
299315
300316 #[ test]
301317 fn rlp_encode_and_decode_block_invoices ( ) {
302318 let invoices = vec ! [ Invoice :: Success , Invoice :: Failed ] ;
303- let parcel_invoices = ParcelInvoices {
304- invoices,
305- } ;
319+ let parcel_invoice = ParcelInvoice :: new ( invoices) ;
306320 let block_invoices = BlockInvoices {
307321 invoices : vec ! [
308- parcel_invoices . clone( ) ,
309- parcel_invoices . clone( ) ,
310- parcel_invoices . clone( ) ,
311- parcel_invoices . clone( ) ,
322+ parcel_invoice . clone( ) ,
323+ parcel_invoice . clone( ) ,
324+ parcel_invoice . clone( ) ,
325+ parcel_invoice . clone( ) ,
312326 ] ,
313327 } ;
314328 let rlp_encoded = block_invoices. rlp_bytes ( ) ;
315- println ! ( "..:{:?}:" , rlp_encoded) ;
316329 let rlp = UntrustedRlp :: new ( & rlp_encoded) ;
317330 let rlp_decoded = rlp. as_val ( ) ;
318331 assert_eq ! ( Ok ( block_invoices) , rlp_decoded) ;
319332 }
333+
334+ #[ test]
335+ fn encode_and_decode_single_success_parcel_invoice ( ) {
336+ let parcel_invoice = ParcelInvoice :: Single ( Invoice :: Success ) ;
337+
338+ let encoded = parcel_invoice. rlp_bytes ( ) ;
339+ let rlp = UntrustedRlp :: new ( & encoded) ;
340+ let decoded = rlp. as_val ( ) ;
341+
342+ assert_eq ! ( Ok ( parcel_invoice) , decoded) ;
343+ }
344+
345+ #[ test]
346+ fn encode_and_decode_single_failed_parcel_invoice ( ) {
347+ let parcel_invoice = ParcelInvoice :: Single ( Invoice :: Failed ) ;
348+
349+ let encoded = parcel_invoice. rlp_bytes ( ) ;
350+ let rlp = UntrustedRlp :: new ( & encoded) ;
351+ let decoded = rlp. as_val ( ) ;
352+
353+ assert_eq ! ( Ok ( parcel_invoice) , decoded) ;
354+ }
355+
356+ #[ test]
357+ fn encode_and_decode_empty_multiple_parcel_invoice ( ) {
358+ let parcel_invoice = ParcelInvoice :: Multiple ( vec ! [ ] ) ;
359+
360+ let encoded = parcel_invoice. rlp_bytes ( ) ;
361+ let rlp = UntrustedRlp :: new ( & encoded) ;
362+ let decoded = rlp. as_val ( ) ;
363+
364+ assert_eq ! ( Ok ( parcel_invoice) , decoded) ;
365+ }
366+
367+ #[ test]
368+ fn encode_and_decode_multiple_parcel_invoice_with_success ( ) {
369+ let parcel_invoice = ParcelInvoice :: Multiple ( vec ! [ Invoice :: Success ] ) ;
370+
371+ let encoded = parcel_invoice. rlp_bytes ( ) ;
372+ let rlp = UntrustedRlp :: new ( & encoded) ;
373+ let decoded = rlp. as_val ( ) ;
374+
375+ assert_eq ! ( Ok ( parcel_invoice) , decoded) ;
376+ }
377+
378+ #[ test]
379+ fn encode_and_decode_multiple_parcel_invoice_with_failed ( ) {
380+ let parcel_invoice = ParcelInvoice :: Multiple ( vec ! [ Invoice :: Failed ] ) ;
381+
382+ let encoded = parcel_invoice. rlp_bytes ( ) ;
383+ let rlp = UntrustedRlp :: new ( & encoded) ;
384+ let decoded = rlp. as_val ( ) ;
385+
386+ assert_eq ! ( Ok ( parcel_invoice) , decoded) ;
387+ }
388+
389+ #[ test]
390+ fn encode_and_decode_multiple_parcel_invoice ( ) {
391+ let parcel_invoice = ParcelInvoice :: Multiple ( vec ! [
392+ Invoice :: Failed ,
393+ Invoice :: Success ,
394+ Invoice :: Success ,
395+ Invoice :: Success ,
396+ Invoice :: Success ,
397+ ] ) ;
398+
399+ let encoded = parcel_invoice. rlp_bytes ( ) ;
400+ let rlp = UntrustedRlp :: new ( & encoded) ;
401+ let decoded = rlp. as_val ( ) ;
402+
403+ assert_eq ! ( Ok ( parcel_invoice) , decoded) ;
404+ }
320405}
0 commit comments