@@ -106,7 +106,7 @@ impl OfferBuilder {
106
106
let offer = OfferContents {
107
107
chains : None , metadata : None , amount : None , description,
108
108
features : OfferFeatures :: empty ( ) , absolute_expiry : None , issuer : None , paths : None ,
109
- supported_quantity : Quantity :: one ( ) , signing_pubkey,
109
+ supported_quantity : Quantity :: One , signing_pubkey,
110
110
} ;
111
111
OfferBuilder { offer }
112
112
}
@@ -178,7 +178,7 @@ impl OfferBuilder {
178
178
}
179
179
180
180
/// Sets the quantity of items for [`Offer::supported_quantity`]. If not called, defaults to
181
- /// [`Quantity::one `].
181
+ /// [`Quantity::One `].
182
182
///
183
183
/// Successive calls to this method will override the previous setting.
184
184
pub fn supported_quantity ( mut self , quantity : Quantity ) -> Self {
@@ -464,19 +464,17 @@ impl OfferContents {
464
464
465
465
fn is_valid_quantity ( & self , quantity : u64 ) -> bool {
466
466
match self . supported_quantity {
467
- Quantity :: Bounded ( n) => {
468
- let n = n. get ( ) ;
469
- if n == 1 { false }
470
- else { quantity > 0 && quantity <= n }
471
- } ,
467
+ Quantity :: Bounded ( n) => quantity <= n. get ( ) ,
472
468
Quantity :: Unbounded => quantity > 0 ,
469
+ Quantity :: One => quantity == 1 ,
473
470
}
474
471
}
475
472
476
473
fn expects_quantity ( & self ) -> bool {
477
474
match self . supported_quantity {
478
- Quantity :: Bounded ( n ) => n . get ( ) != 1 ,
475
+ Quantity :: Bounded ( _ ) => true ,
479
476
Quantity :: Unbounded => true ,
477
+ Quantity :: One => false ,
480
478
}
481
479
}
482
480
@@ -549,25 +547,24 @@ pub type CurrencyCode = [u8; 3];
549
547
/// Quantity of items supported by an [`Offer`].
550
548
#[ derive( Clone , Copy , Debug , PartialEq ) ]
551
549
pub enum Quantity {
552
- /// Up to a specific number of items (inclusive).
550
+ /// Up to a specific number of items (inclusive). Use when more than one item can be requested
551
+ /// but is limited (e.g., because of per customer or inventory limits).
552
+ ///
553
+ /// May be used with `NonZeroU64::new(1)` but prefer to use [`Quantity::One`] if only one item
554
+ /// is supported.
553
555
Bounded ( NonZeroU64 ) ,
554
- /// One or more items.
556
+ /// One or more items. Use when more than one item can be requested without any limit.
555
557
Unbounded ,
558
+ /// Only one item. Use when only a single item can be requested.
559
+ One ,
556
560
}
557
561
558
562
impl Quantity {
559
- /// The default quantity of one.
560
- pub fn one ( ) -> Self {
561
- Quantity :: Bounded ( NonZeroU64 :: new ( 1 ) . unwrap ( ) )
562
- }
563
-
564
563
fn to_tlv_record ( & self ) -> Option < u64 > {
565
564
match self {
566
- Quantity :: Bounded ( n) => {
567
- let n = n. get ( ) ;
568
- if n == 1 { None } else { Some ( n) }
569
- } ,
565
+ Quantity :: Bounded ( n) => Some ( n. get ( ) ) ,
570
566
Quantity :: Unbounded => Some ( 0 ) ,
567
+ Quantity :: One => None ,
571
568
}
572
569
}
573
570
}
@@ -639,9 +636,8 @@ impl TryFrom<OfferTlvStream> for OfferContents {
639
636
. map ( |seconds_from_epoch| Duration :: from_secs ( seconds_from_epoch) ) ;
640
637
641
638
let supported_quantity = match quantity_max {
642
- None => Quantity :: one ( ) ,
639
+ None => Quantity :: One ,
643
640
Some ( 0 ) => Quantity :: Unbounded ,
644
- Some ( 1 ) => return Err ( SemanticError :: InvalidQuantity ) ,
645
641
Some ( n) => Quantity :: Bounded ( NonZeroU64 :: new ( n) . unwrap ( ) ) ,
646
642
} ;
647
643
@@ -708,7 +704,7 @@ mod tests {
708
704
assert ! ( !offer. is_expired( ) ) ;
709
705
assert_eq ! ( offer. paths( ) , & [ ] ) ;
710
706
assert_eq ! ( offer. issuer( ) , None ) ;
711
- assert_eq ! ( offer. supported_quantity( ) , Quantity :: one ( ) ) ;
707
+ assert_eq ! ( offer. supported_quantity( ) , Quantity :: One ) ;
712
708
assert_eq ! ( offer. signing_pubkey( ) , pubkey( 42 ) ) ;
713
709
714
710
assert_eq ! (
@@ -930,14 +926,15 @@ mod tests {
930
926
931
927
#[ test]
932
928
fn builds_offer_with_supported_quantity ( ) {
929
+ let one = NonZeroU64 :: new ( 1 ) . unwrap ( ) ;
933
930
let ten = NonZeroU64 :: new ( 10 ) . unwrap ( ) ;
934
931
935
932
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
936
- . supported_quantity ( Quantity :: one ( ) )
933
+ . supported_quantity ( Quantity :: One )
937
934
. build ( )
938
935
. unwrap ( ) ;
939
936
let tlv_stream = offer. as_tlv_stream ( ) ;
940
- assert_eq ! ( offer. supported_quantity( ) , Quantity :: one ( ) ) ;
937
+ assert_eq ! ( offer. supported_quantity( ) , Quantity :: One ) ;
941
938
assert_eq ! ( tlv_stream. quantity_max, None ) ;
942
939
943
940
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
@@ -956,13 +953,21 @@ mod tests {
956
953
assert_eq ! ( offer. supported_quantity( ) , Quantity :: Bounded ( ten) ) ;
957
954
assert_eq ! ( tlv_stream. quantity_max, Some ( 10 ) ) ;
958
955
956
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
957
+ . supported_quantity ( Quantity :: Bounded ( one) )
958
+ . build ( )
959
+ . unwrap ( ) ;
960
+ let tlv_stream = offer. as_tlv_stream ( ) ;
961
+ assert_eq ! ( offer. supported_quantity( ) , Quantity :: Bounded ( one) ) ;
962
+ assert_eq ! ( tlv_stream. quantity_max, Some ( 1 ) ) ;
963
+
959
964
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
960
965
. supported_quantity ( Quantity :: Bounded ( ten) )
961
- . supported_quantity ( Quantity :: one ( ) )
966
+ . supported_quantity ( Quantity :: One )
962
967
. build ( )
963
968
. unwrap ( ) ;
964
969
let tlv_stream = offer. as_tlv_stream ( ) ;
965
- assert_eq ! ( offer. supported_quantity( ) , Quantity :: one ( ) ) ;
970
+ assert_eq ! ( offer. supported_quantity( ) , Quantity :: One ) ;
966
971
assert_eq ! ( tlv_stream. quantity_max, None ) ;
967
972
}
968
973
@@ -1094,7 +1099,7 @@ mod tests {
1094
1099
#[ test]
1095
1100
fn parses_offer_with_quantity ( ) {
1096
1101
let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
1097
- . supported_quantity ( Quantity :: one ( ) )
1102
+ . supported_quantity ( Quantity :: One )
1098
1103
. build ( )
1099
1104
. unwrap ( ) ;
1100
1105
if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
@@ -1117,17 +1122,12 @@ mod tests {
1117
1122
panic ! ( "error parsing offer: {:?}" , e) ;
1118
1123
}
1119
1124
1120
- let mut tlv_stream = offer. as_tlv_stream ( ) ;
1121
- tlv_stream. quantity_max = Some ( 1 ) ;
1122
-
1123
- let mut encoded_offer = Vec :: new ( ) ;
1124
- tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1125
-
1126
- match Offer :: try_from ( encoded_offer) {
1127
- Ok ( _) => panic ! ( "expected error" ) ,
1128
- Err ( e) => {
1129
- assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ;
1130
- } ,
1125
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
1126
+ . supported_quantity ( Quantity :: Bounded ( NonZeroU64 :: new ( 1 ) . unwrap ( ) ) )
1127
+ . build ( )
1128
+ . unwrap ( ) ;
1129
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
1130
+ panic ! ( "error parsing offer: {:?}" , e) ;
1131
1131
}
1132
1132
}
1133
1133
0 commit comments