46
46
//! .issuer("Foo Bar".to_string())
47
47
//! .path(create_blinded_path())
48
48
//! .path(create_another_blinded_path())
49
- //! .build();
49
+ //! .build()
50
+ //! .unwrap();
50
51
//! # Ok(())
51
52
//! # }
52
53
//! ```
@@ -194,24 +195,22 @@ impl OfferBuilder {
194
195
}
195
196
}
196
197
197
- // Assume quantity isn't supported if the range is empty.
198
- if self . offer . quantity_min ( ) > self . offer . quantity_max ( ) {
199
- self . offer . quantity_min = None ;
200
- self . offer . quantity_max = None ;
201
- }
202
-
203
198
self
204
199
}
205
200
206
201
/// Builds an [`Offer`] from the builder's settings.
207
- pub fn build ( self ) -> Offer {
202
+ pub fn build ( self ) -> Result < Offer , ( ) > {
203
+ if self . offer . quantity_min ( ) > self . offer . quantity_max ( ) {
204
+ return Err ( ( ) ) ;
205
+ }
206
+
208
207
let mut bytes = Vec :: new ( ) ;
209
208
self . offer . write ( & mut bytes) . unwrap ( ) ;
210
209
211
- Offer {
210
+ Ok ( Offer {
212
211
bytes,
213
212
contents : self . offer ,
214
- }
213
+ } )
215
214
}
216
215
}
217
216
@@ -439,7 +438,7 @@ mod tests {
439
438
440
439
#[ test]
441
440
fn builds_offer_with_defaults ( ) {
442
- let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) ;
441
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
443
442
let tlv_stream = offer. as_tlv_stream ( ) ;
444
443
445
444
assert_eq ! ( offer. as_bytes( ) , & offer. to_bytes( ) [ ..] ) ;
@@ -481,21 +480,24 @@ mod tests {
481
480
482
481
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
483
482
. chain ( Network :: Bitcoin )
484
- . build ( ) ;
483
+ . build ( )
484
+ . unwrap ( ) ;
485
485
assert_eq ! ( offer. chains( ) , vec![ chain] ) ;
486
486
assert_eq ! ( offer. as_tlv_stream( ) . chains, Some ( & vec![ chain] ) ) ;
487
487
488
488
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
489
489
. chain ( Network :: Bitcoin )
490
490
. chain ( Network :: Bitcoin )
491
- . build ( ) ;
491
+ . build ( )
492
+ . unwrap ( ) ;
492
493
assert_eq ! ( offer. chains( ) , vec![ chain] ) ;
493
494
assert_eq ! ( offer. as_tlv_stream( ) . chains, Some ( & vec![ chain] ) ) ;
494
495
495
496
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
496
497
. chain ( Network :: Bitcoin )
497
498
. chain ( Network :: Testnet )
498
- . build ( ) ;
499
+ . build ( )
500
+ . unwrap ( ) ;
499
501
assert_eq ! ( offer. chains( ) , chaines) ;
500
502
assert_eq ! ( offer. as_tlv_stream( ) . chains, Some ( & chaines) ) ;
501
503
}
@@ -504,14 +506,16 @@ mod tests {
504
506
fn builds_offer_with_metadata ( ) {
505
507
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
506
508
. metadata ( vec ! [ 42 ; 32 ] )
507
- . build ( ) ;
509
+ . build ( )
510
+ . unwrap ( ) ;
508
511
assert_eq ! ( offer. metadata( ) , Some ( & vec![ 42 ; 32 ] ) ) ;
509
512
assert_eq ! ( offer. as_tlv_stream( ) . metadata, Some ( & vec![ 42 ; 32 ] ) ) ;
510
513
511
514
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
512
515
. metadata ( vec ! [ 42 ; 32 ] )
513
516
. metadata ( vec ! [ 43 ; 32 ] )
514
- . build ( ) ;
517
+ . build ( )
518
+ . unwrap ( ) ;
515
519
assert_eq ! ( offer. metadata( ) , Some ( & vec![ 43 ; 32 ] ) ) ;
516
520
assert_eq ! ( offer. as_tlv_stream( ) . metadata, Some ( & vec![ 43 ; 32 ] ) ) ;
517
521
}
@@ -523,15 +527,17 @@ mod tests {
523
527
524
528
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
525
529
. amount ( bitcoin_amount. clone ( ) )
526
- . build ( ) ;
530
+ . build ( )
531
+ . unwrap ( ) ;
527
532
let tlv_stream = offer. as_tlv_stream ( ) ;
528
533
assert_eq ! ( offer. amount( ) , Some ( & bitcoin_amount) ) ;
529
534
assert_eq ! ( tlv_stream. amount, Some ( 1000 ) ) ;
530
535
assert_eq ! ( tlv_stream. currency, None ) ;
531
536
532
537
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
533
538
. amount ( currency_amount. clone ( ) )
534
- . build ( ) ;
539
+ . build ( )
540
+ . unwrap ( ) ;
535
541
let tlv_stream = offer. as_tlv_stream ( ) ;
536
542
assert_eq ! ( offer. amount( ) , Some ( & currency_amount) ) ;
537
543
assert_eq ! ( tlv_stream. amount, Some ( 10 ) ) ;
@@ -540,7 +546,8 @@ mod tests {
540
546
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
541
547
. amount ( currency_amount. clone ( ) )
542
548
. amount ( bitcoin_amount. clone ( ) )
543
- . build ( ) ;
549
+ . build ( )
550
+ . unwrap ( ) ;
544
551
let tlv_stream = offer. as_tlv_stream ( ) ;
545
552
assert_eq ! ( tlv_stream. amount, Some ( 1000 ) ) ;
546
553
assert_eq ! ( tlv_stream. currency, None ) ;
@@ -550,14 +557,16 @@ mod tests {
550
557
fn builds_offer_with_features ( ) {
551
558
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
552
559
. features ( OfferFeatures :: empty ( ) )
553
- . build ( ) ;
560
+ . build ( )
561
+ . unwrap ( ) ;
554
562
assert_eq ! ( offer. features( ) , Some ( & OfferFeatures :: empty( ) ) ) ;
555
563
assert_eq ! ( offer. as_tlv_stream( ) . features, Some ( & OfferFeatures :: empty( ) ) ) ;
556
564
557
565
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
558
566
. features ( OfferFeatures :: unknown ( ) )
559
567
. features ( OfferFeatures :: empty ( ) )
560
- . build ( ) ;
568
+ . build ( )
569
+ . unwrap ( ) ;
561
570
assert_eq ! ( offer. features( ) , Some ( & OfferFeatures :: empty( ) ) ) ;
562
571
assert_eq ! ( offer. as_tlv_stream( ) . features, Some ( & OfferFeatures :: empty( ) ) ) ;
563
572
}
@@ -569,7 +578,8 @@ mod tests {
569
578
570
579
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
571
580
. absolute_expiry ( future_expiry)
572
- . build ( ) ;
581
+ . build ( )
582
+ . unwrap ( ) ;
573
583
#[ cfg( feature = "std" ) ]
574
584
assert ! ( !offer. is_expired( ) ) ;
575
585
assert_eq ! ( offer. absolute_expiry( ) , Some ( future_expiry) ) ;
@@ -578,7 +588,8 @@ mod tests {
578
588
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
579
589
. absolute_expiry ( future_expiry)
580
590
. absolute_expiry ( past_expiry)
581
- . build ( ) ;
591
+ . build ( )
592
+ . unwrap ( ) ;
582
593
#[ cfg( feature = "std" ) ]
583
594
assert ! ( offer. is_expired( ) ) ;
584
595
assert_eq ! ( offer. absolute_expiry( ) , Some ( past_expiry) ) ;
@@ -609,7 +620,8 @@ mod tests {
609
620
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
610
621
. path ( paths[ 0 ] . clone ( ) )
611
622
. path ( paths[ 1 ] . clone ( ) )
612
- . build ( ) ;
623
+ . build ( )
624
+ . unwrap ( ) ;
613
625
let tlv_stream = offer. as_tlv_stream ( ) ;
614
626
assert_eq ! ( offer. paths( ) , Some ( & paths) ) ;
615
627
assert_eq ! ( offer. signing_pubkey( ) , pubkey( 42 ) ) ;
@@ -622,14 +634,16 @@ mod tests {
622
634
fn builds_offer_with_issuer ( ) {
623
635
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
624
636
. issuer ( "bar" . into ( ) )
625
- . build ( ) ;
637
+ . build ( )
638
+ . unwrap ( ) ;
626
639
assert_eq ! ( offer. issuer( ) , Some ( & String :: from( "bar" ) ) ) ;
627
640
assert_eq ! ( offer. as_tlv_stream( ) . issuer, Some ( & String :: from( "bar" ) ) ) ;
628
641
629
642
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
630
643
. issuer ( "bar" . into ( ) )
631
644
. issuer ( "baz" . into ( ) )
632
- . build ( ) ;
645
+ . build ( )
646
+ . unwrap ( ) ;
633
647
assert_eq ! ( offer. issuer( ) , Some ( & String :: from( "baz" ) ) ) ;
634
648
assert_eq ! ( offer. as_tlv_stream( ) . issuer, Some ( & String :: from( "baz" ) ) ) ;
635
649
}
@@ -642,7 +656,8 @@ mod tests {
642
656
643
657
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
644
658
. quantity_fixed ( one)
645
- . build ( ) ;
659
+ . build ( )
660
+ . unwrap ( ) ;
646
661
let tlv_stream = offer. as_tlv_stream ( ) ;
647
662
assert_eq ! ( offer. quantity_min( ) , 1 ) ;
648
663
assert_eq ! ( offer. quantity_max( ) , 1 ) ;
@@ -651,7 +666,8 @@ mod tests {
651
666
652
667
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
653
668
. quantity_fixed ( ten)
654
- . build ( ) ;
669
+ . build ( )
670
+ . unwrap ( ) ;
655
671
let tlv_stream = offer. as_tlv_stream ( ) ;
656
672
assert_eq ! ( offer. quantity_min( ) , 10 ) ;
657
673
assert_eq ! ( offer. quantity_max( ) , 10 ) ;
@@ -661,7 +677,8 @@ mod tests {
661
677
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
662
678
. quantity_fixed ( ten)
663
679
. quantity_fixed ( five)
664
- . build ( ) ;
680
+ . build ( )
681
+ . unwrap ( ) ;
665
682
let tlv_stream = offer. as_tlv_stream ( ) ;
666
683
assert_eq ! ( offer. quantity_min( ) , 5 ) ;
667
684
assert_eq ! ( offer. quantity_max( ) , 5 ) ;
@@ -671,7 +688,8 @@ mod tests {
671
688
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
672
689
. quantity_range ( ..ten)
673
690
. quantity_fixed ( five)
674
- . build ( ) ;
691
+ . build ( )
692
+ . unwrap ( ) ;
675
693
let tlv_stream = offer. as_tlv_stream ( ) ;
676
694
assert_eq ! ( offer. quantity_min( ) , 5 ) ;
677
695
assert_eq ! ( offer. quantity_max( ) , 5 ) ;
@@ -687,7 +705,8 @@ mod tests {
687
705
688
706
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
689
707
. quantity_range ( ..)
690
- . build ( ) ;
708
+ . build ( )
709
+ . unwrap ( ) ;
691
710
let tlv_stream = offer. as_tlv_stream ( ) ;
692
711
assert_eq ! ( offer. quantity_min( ) , 1 ) ;
693
712
assert_eq ! ( offer. quantity_max( ) , u64 :: max_value( ) ) ;
@@ -696,7 +715,8 @@ mod tests {
696
715
697
716
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
698
717
. quantity_range ( ..ten)
699
- . build ( ) ;
718
+ . build ( )
719
+ . unwrap ( ) ;
700
720
let tlv_stream = offer. as_tlv_stream ( ) ;
701
721
assert_eq ! ( offer. quantity_min( ) , 1 ) ;
702
722
assert_eq ! ( offer. quantity_max( ) , 9 ) ;
@@ -705,7 +725,8 @@ mod tests {
705
725
706
726
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
707
727
. quantity_range ( one..ten)
708
- . build ( ) ;
728
+ . build ( )
729
+ . unwrap ( ) ;
709
730
let tlv_stream = offer. as_tlv_stream ( ) ;
710
731
assert_eq ! ( offer. quantity_min( ) , 1 ) ;
711
732
assert_eq ! ( offer. quantity_max( ) , 9 ) ;
@@ -714,7 +735,8 @@ mod tests {
714
735
715
736
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
716
737
. quantity_range ( five..=ten)
717
- . build ( ) ;
738
+ . build ( )
739
+ . unwrap ( ) ;
718
740
let tlv_stream = offer. as_tlv_stream ( ) ;
719
741
assert_eq ! ( offer. quantity_min( ) , 5 ) ;
720
742
assert_eq ! ( offer. quantity_max( ) , 10 ) ;
@@ -724,7 +746,8 @@ mod tests {
724
746
let one = NonZeroU64 :: new ( 1 ) . unwrap ( ) ;
725
747
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
726
748
. quantity_range ( one..=one)
727
- . build ( ) ;
749
+ . build ( )
750
+ . unwrap ( ) ;
728
751
let tlv_stream = offer. as_tlv_stream ( ) ;
729
752
assert_eq ! ( offer. quantity_min( ) , 1 ) ;
730
753
assert_eq ! ( offer. quantity_max( ) , 1 ) ;
@@ -733,30 +756,29 @@ mod tests {
733
756
734
757
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
735
758
. quantity_range ( five..=five)
736
- . build ( ) ;
759
+ . build ( )
760
+ . unwrap ( ) ;
737
761
let tlv_stream = offer. as_tlv_stream ( ) ;
738
762
assert_eq ! ( offer. quantity_min( ) , 5 ) ;
739
763
assert_eq ! ( offer. quantity_max( ) , 5 ) ;
740
764
assert_eq ! ( tlv_stream. quantity_min, Some ( 5 ) ) ;
741
765
assert_eq ! ( tlv_stream. quantity_max, Some ( 5 ) ) ;
742
766
743
- let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
744
- . quantity_range ( ten..five)
745
- . build ( ) ;
746
- let tlv_stream = offer. as_tlv_stream ( ) ;
747
- assert_eq ! ( offer. quantity_min( ) , 1 ) ;
748
- assert_eq ! ( offer. quantity_max( ) , 1 ) ;
749
- assert_eq ! ( tlv_stream. quantity_min, None ) ;
750
- assert_eq ! ( tlv_stream. quantity_max, None ) ;
751
-
752
767
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
753
768
. quantity_fixed ( five)
754
769
. quantity_range ( ..ten)
755
- . build ( ) ;
770
+ . build ( )
771
+ . unwrap ( ) ;
756
772
let tlv_stream = offer. as_tlv_stream ( ) ;
757
773
assert_eq ! ( offer. quantity_min( ) , 1 ) ;
758
774
assert_eq ! ( offer. quantity_max( ) , 9 ) ;
759
775
assert_eq ! ( tlv_stream. quantity_min, None ) ;
760
776
assert_eq ! ( tlv_stream. quantity_max, Some ( 9 ) ) ;
777
+
778
+ assert ! ( OfferBuilder :: new( "foo" . into( ) , pubkey( 42 ) )
779
+ . quantity_range( ten..five)
780
+ . build( )
781
+ . is_err( )
782
+ ) ;
761
783
}
762
784
}
0 commit comments