Skip to content

Commit b087740

Browse files
committed
f - builder error for invalid range
1 parent 37282e8 commit b087740

File tree

1 file changed

+68
-46
lines changed

1 file changed

+68
-46
lines changed

lightning/src/offers/offer.rs

Lines changed: 68 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@
4646
//! .issuer("Foo Bar".to_string())
4747
//! .path(create_blinded_path())
4848
//! .path(create_another_blinded_path())
49-
//! .build();
49+
//! .build()
50+
//! .unwrap();
5051
//! # Ok(())
5152
//! # }
5253
//! ```
@@ -194,24 +195,22 @@ impl OfferBuilder {
194195
}
195196
}
196197

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-
203198
self
204199
}
205200

206201
/// 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+
208207
let mut bytes = Vec::new();
209208
self.offer.write(&mut bytes).unwrap();
210209

211-
Offer {
210+
Ok(Offer {
212211
bytes,
213212
contents: self.offer,
214-
}
213+
})
215214
}
216215
}
217216

@@ -439,7 +438,7 @@ mod tests {
439438

440439
#[test]
441440
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();
443442
let tlv_stream = offer.as_tlv_stream();
444443

445444
assert_eq!(offer.as_bytes(), &offer.to_bytes()[..]);
@@ -481,21 +480,24 @@ mod tests {
481480

482481
let offer = OfferBuilder::new("foo".into(), pubkey(42))
483482
.chain(Network::Bitcoin)
484-
.build();
483+
.build()
484+
.unwrap();
485485
assert_eq!(offer.chains(), vec![chain]);
486486
assert_eq!(offer.as_tlv_stream().chains, Some(&vec![chain]));
487487

488488
let offer = OfferBuilder::new("foo".into(), pubkey(42))
489489
.chain(Network::Bitcoin)
490490
.chain(Network::Bitcoin)
491-
.build();
491+
.build()
492+
.unwrap();
492493
assert_eq!(offer.chains(), vec![chain]);
493494
assert_eq!(offer.as_tlv_stream().chains, Some(&vec![chain]));
494495

495496
let offer = OfferBuilder::new("foo".into(), pubkey(42))
496497
.chain(Network::Bitcoin)
497498
.chain(Network::Testnet)
498-
.build();
499+
.build()
500+
.unwrap();
499501
assert_eq!(offer.chains(), chaines);
500502
assert_eq!(offer.as_tlv_stream().chains, Some(&chaines));
501503
}
@@ -504,14 +506,16 @@ mod tests {
504506
fn builds_offer_with_metadata() {
505507
let offer = OfferBuilder::new("foo".into(), pubkey(42))
506508
.metadata(vec![42; 32])
507-
.build();
509+
.build()
510+
.unwrap();
508511
assert_eq!(offer.metadata(), Some(&vec![42; 32]));
509512
assert_eq!(offer.as_tlv_stream().metadata, Some(&vec![42; 32]));
510513

511514
let offer = OfferBuilder::new("foo".into(), pubkey(42))
512515
.metadata(vec![42; 32])
513516
.metadata(vec![43; 32])
514-
.build();
517+
.build()
518+
.unwrap();
515519
assert_eq!(offer.metadata(), Some(&vec![43; 32]));
516520
assert_eq!(offer.as_tlv_stream().metadata, Some(&vec![43; 32]));
517521
}
@@ -523,15 +527,17 @@ mod tests {
523527

524528
let offer = OfferBuilder::new("foo".into(), pubkey(42))
525529
.amount(bitcoin_amount.clone())
526-
.build();
530+
.build()
531+
.unwrap();
527532
let tlv_stream = offer.as_tlv_stream();
528533
assert_eq!(offer.amount(), Some(&bitcoin_amount));
529534
assert_eq!(tlv_stream.amount, Some(1000));
530535
assert_eq!(tlv_stream.currency, None);
531536

532537
let offer = OfferBuilder::new("foo".into(), pubkey(42))
533538
.amount(currency_amount.clone())
534-
.build();
539+
.build()
540+
.unwrap();
535541
let tlv_stream = offer.as_tlv_stream();
536542
assert_eq!(offer.amount(), Some(&currency_amount));
537543
assert_eq!(tlv_stream.amount, Some(10));
@@ -540,7 +546,8 @@ mod tests {
540546
let offer = OfferBuilder::new("foo".into(), pubkey(42))
541547
.amount(currency_amount.clone())
542548
.amount(bitcoin_amount.clone())
543-
.build();
549+
.build()
550+
.unwrap();
544551
let tlv_stream = offer.as_tlv_stream();
545552
assert_eq!(tlv_stream.amount, Some(1000));
546553
assert_eq!(tlv_stream.currency, None);
@@ -550,14 +557,16 @@ mod tests {
550557
fn builds_offer_with_features() {
551558
let offer = OfferBuilder::new("foo".into(), pubkey(42))
552559
.features(OfferFeatures::empty())
553-
.build();
560+
.build()
561+
.unwrap();
554562
assert_eq!(offer.features(), Some(&OfferFeatures::empty()));
555563
assert_eq!(offer.as_tlv_stream().features, Some(&OfferFeatures::empty()));
556564

557565
let offer = OfferBuilder::new("foo".into(), pubkey(42))
558566
.features(OfferFeatures::unknown())
559567
.features(OfferFeatures::empty())
560-
.build();
568+
.build()
569+
.unwrap();
561570
assert_eq!(offer.features(), Some(&OfferFeatures::empty()));
562571
assert_eq!(offer.as_tlv_stream().features, Some(&OfferFeatures::empty()));
563572
}
@@ -569,7 +578,8 @@ mod tests {
569578

570579
let offer = OfferBuilder::new("foo".into(), pubkey(42))
571580
.absolute_expiry(future_expiry)
572-
.build();
581+
.build()
582+
.unwrap();
573583
#[cfg(feature = "std")]
574584
assert!(!offer.is_expired());
575585
assert_eq!(offer.absolute_expiry(), Some(future_expiry));
@@ -578,7 +588,8 @@ mod tests {
578588
let offer = OfferBuilder::new("foo".into(), pubkey(42))
579589
.absolute_expiry(future_expiry)
580590
.absolute_expiry(past_expiry)
581-
.build();
591+
.build()
592+
.unwrap();
582593
#[cfg(feature = "std")]
583594
assert!(offer.is_expired());
584595
assert_eq!(offer.absolute_expiry(), Some(past_expiry));
@@ -609,7 +620,8 @@ mod tests {
609620
let offer = OfferBuilder::new("foo".into(), pubkey(42))
610621
.path(paths[0].clone())
611622
.path(paths[1].clone())
612-
.build();
623+
.build()
624+
.unwrap();
613625
let tlv_stream = offer.as_tlv_stream();
614626
assert_eq!(offer.paths(), Some(&paths));
615627
assert_eq!(offer.signing_pubkey(), pubkey(42));
@@ -622,14 +634,16 @@ mod tests {
622634
fn builds_offer_with_issuer() {
623635
let offer = OfferBuilder::new("foo".into(), pubkey(42))
624636
.issuer("bar".into())
625-
.build();
637+
.build()
638+
.unwrap();
626639
assert_eq!(offer.issuer(), Some(&String::from("bar")));
627640
assert_eq!(offer.as_tlv_stream().issuer, Some(&String::from("bar")));
628641

629642
let offer = OfferBuilder::new("foo".into(), pubkey(42))
630643
.issuer("bar".into())
631644
.issuer("baz".into())
632-
.build();
645+
.build()
646+
.unwrap();
633647
assert_eq!(offer.issuer(), Some(&String::from("baz")));
634648
assert_eq!(offer.as_tlv_stream().issuer, Some(&String::from("baz")));
635649
}
@@ -642,7 +656,8 @@ mod tests {
642656

643657
let offer = OfferBuilder::new("foo".into(), pubkey(42))
644658
.quantity_fixed(one)
645-
.build();
659+
.build()
660+
.unwrap();
646661
let tlv_stream = offer.as_tlv_stream();
647662
assert_eq!(offer.quantity_min(), 1);
648663
assert_eq!(offer.quantity_max(), 1);
@@ -651,7 +666,8 @@ mod tests {
651666

652667
let offer = OfferBuilder::new("foo".into(), pubkey(42))
653668
.quantity_fixed(ten)
654-
.build();
669+
.build()
670+
.unwrap();
655671
let tlv_stream = offer.as_tlv_stream();
656672
assert_eq!(offer.quantity_min(), 10);
657673
assert_eq!(offer.quantity_max(), 10);
@@ -661,7 +677,8 @@ mod tests {
661677
let offer = OfferBuilder::new("foo".into(), pubkey(42))
662678
.quantity_fixed(ten)
663679
.quantity_fixed(five)
664-
.build();
680+
.build()
681+
.unwrap();
665682
let tlv_stream = offer.as_tlv_stream();
666683
assert_eq!(offer.quantity_min(), 5);
667684
assert_eq!(offer.quantity_max(), 5);
@@ -671,7 +688,8 @@ mod tests {
671688
let offer = OfferBuilder::new("foo".into(), pubkey(42))
672689
.quantity_range(..ten)
673690
.quantity_fixed(five)
674-
.build();
691+
.build()
692+
.unwrap();
675693
let tlv_stream = offer.as_tlv_stream();
676694
assert_eq!(offer.quantity_min(), 5);
677695
assert_eq!(offer.quantity_max(), 5);
@@ -687,7 +705,8 @@ mod tests {
687705

688706
let offer = OfferBuilder::new("foo".into(), pubkey(42))
689707
.quantity_range(..)
690-
.build();
708+
.build()
709+
.unwrap();
691710
let tlv_stream = offer.as_tlv_stream();
692711
assert_eq!(offer.quantity_min(), 1);
693712
assert_eq!(offer.quantity_max(), u64::max_value());
@@ -696,7 +715,8 @@ mod tests {
696715

697716
let offer = OfferBuilder::new("foo".into(), pubkey(42))
698717
.quantity_range(..ten)
699-
.build();
718+
.build()
719+
.unwrap();
700720
let tlv_stream = offer.as_tlv_stream();
701721
assert_eq!(offer.quantity_min(), 1);
702722
assert_eq!(offer.quantity_max(), 9);
@@ -705,7 +725,8 @@ mod tests {
705725

706726
let offer = OfferBuilder::new("foo".into(), pubkey(42))
707727
.quantity_range(one..ten)
708-
.build();
728+
.build()
729+
.unwrap();
709730
let tlv_stream = offer.as_tlv_stream();
710731
assert_eq!(offer.quantity_min(), 1);
711732
assert_eq!(offer.quantity_max(), 9);
@@ -714,7 +735,8 @@ mod tests {
714735

715736
let offer = OfferBuilder::new("foo".into(), pubkey(42))
716737
.quantity_range(five..=ten)
717-
.build();
738+
.build()
739+
.unwrap();
718740
let tlv_stream = offer.as_tlv_stream();
719741
assert_eq!(offer.quantity_min(), 5);
720742
assert_eq!(offer.quantity_max(), 10);
@@ -724,7 +746,8 @@ mod tests {
724746
let one = NonZeroU64::new(1).unwrap();
725747
let offer = OfferBuilder::new("foo".into(), pubkey(42))
726748
.quantity_range(one..=one)
727-
.build();
749+
.build()
750+
.unwrap();
728751
let tlv_stream = offer.as_tlv_stream();
729752
assert_eq!(offer.quantity_min(), 1);
730753
assert_eq!(offer.quantity_max(), 1);
@@ -733,30 +756,29 @@ mod tests {
733756

734757
let offer = OfferBuilder::new("foo".into(), pubkey(42))
735758
.quantity_range(five..=five)
736-
.build();
759+
.build()
760+
.unwrap();
737761
let tlv_stream = offer.as_tlv_stream();
738762
assert_eq!(offer.quantity_min(), 5);
739763
assert_eq!(offer.quantity_max(), 5);
740764
assert_eq!(tlv_stream.quantity_min, Some(5));
741765
assert_eq!(tlv_stream.quantity_max, Some(5));
742766

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-
752767
let offer = OfferBuilder::new("foo".into(), pubkey(42))
753768
.quantity_fixed(five)
754769
.quantity_range(..ten)
755-
.build();
770+
.build()
771+
.unwrap();
756772
let tlv_stream = offer.as_tlv_stream();
757773
assert_eq!(offer.quantity_min(), 1);
758774
assert_eq!(offer.quantity_max(), 9);
759775
assert_eq!(tlv_stream.quantity_min, None);
760776
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+
);
761783
}
762784
}

0 commit comments

Comments
 (0)