@@ -824,72 +824,85 @@ pub(super) fn public_key(public_key: &str) -> Result<Option<PublicKey>, CliError
824
824
825
825
pub ( super ) fn pricing_mode (
826
826
pricing_mode_identifier_str : & str ,
827
- maybe_payment_amount_str : & str ,
828
- maybe_gas_price_tolerance_str : & str ,
829
- maybe_standard_payment_str : & str ,
827
+ payment_amount_str : & str ,
828
+ gas_price_tolerance_str : & str ,
829
+ additional_computation_factor_str : & str ,
830
+ standard_payment_str : & str ,
830
831
maybe_receipt : Option < Digest > ,
831
832
) -> Result < PricingMode , CliError > {
832
833
match pricing_mode_identifier_str. to_lowercase ( ) . as_str ( ) {
833
834
"classic" => {
834
- if maybe_gas_price_tolerance_str . is_empty ( ) {
835
+ if gas_price_tolerance_str . is_empty ( ) {
835
836
return Err ( CliError :: InvalidArgument {
836
837
context : "gas_price_tolerance" ,
837
838
error : "Gas price tolerance is required" . to_string ( ) ,
838
839
} ) ;
839
840
}
840
- if maybe_payment_amount_str . is_empty ( ) {
841
+ if payment_amount_str . is_empty ( ) {
841
842
return Err ( CliError :: InvalidArgument {
842
843
context : "payment_amount" ,
843
844
error : "Payment amount is required" . to_string ( ) ,
844
845
} ) ;
845
846
}
846
- if maybe_standard_payment_str . is_empty ( ) {
847
+ if standard_payment_str . is_empty ( ) {
847
848
return Err ( CliError :: InvalidArgument {
848
849
context : "standard_payment" ,
849
850
error : "Standard payment flag is required" . to_string ( ) ,
850
851
} ) ;
851
852
}
852
- let gas_price_tolerance =
853
- maybe_gas_price_tolerance_str
854
- . parse :: < u8 > ( )
855
- . map_err ( |error| CliError :: FailedToParseInt {
856
- context : "gas_price_tolerance" ,
857
- error,
858
- } ) ?;
859
- let payment_amount = maybe_payment_amount_str. parse :: < u64 > ( ) . map_err ( |error| {
853
+ let gas_price_tolerance = gas_price_tolerance_str. parse :: < u8 > ( ) . map_err ( |error| {
860
854
CliError :: FailedToParseInt {
861
- context : "payment_amount " ,
855
+ context : "gas_price_tolerance " ,
862
856
error,
863
857
}
864
858
} ) ?;
865
- let standard_payment = maybe_standard_payment_str
866
- . parse :: < bool > ( )
867
- . map_err ( |error| CliError :: FailedToParseBool {
859
+ let payment_amount =
860
+ payment_amount_str
861
+ . parse :: < u64 > ( )
862
+ . map_err ( |error| CliError :: FailedToParseInt {
863
+ context : "payment_amount" ,
864
+ error,
865
+ } ) ?;
866
+ let standard_payment = standard_payment_str. parse :: < bool > ( ) . map_err ( |error| {
867
+ CliError :: FailedToParseBool {
868
868
context : "standard_payment" ,
869
869
error,
870
- } ) ?;
870
+ }
871
+ } ) ?;
871
872
Ok ( PricingMode :: Classic {
872
873
payment_amount,
873
874
gas_price_tolerance,
874
875
standard_payment,
875
876
} )
876
877
}
877
878
"fixed" => {
878
- if maybe_gas_price_tolerance_str . is_empty ( ) {
879
+ if gas_price_tolerance_str . is_empty ( ) {
879
880
return Err ( CliError :: InvalidArgument {
880
881
context : "gas_price_tolerance" ,
881
882
error : "Gas price tolerance is required" . to_string ( ) ,
882
883
} ) ;
883
884
}
884
- let gas_price_tolerance =
885
- maybe_gas_price_tolerance_str
885
+ let gas_price_tolerance = gas_price_tolerance_str. parse :: < u8 > ( ) . map_err ( |error| {
886
+ CliError :: FailedToParseInt {
887
+ context : "gas_price_tolerance" ,
888
+ error,
889
+ }
890
+ } ) ?;
891
+
892
+ // Additional Computation Factor defaults to 0 if the string is empty
893
+ let additional_computation_factor = if additional_computation_factor_str. is_empty ( ) {
894
+ u8:: default ( )
895
+ } else {
896
+ additional_computation_factor_str
886
897
. parse :: < u8 > ( )
887
898
. map_err ( |error| CliError :: FailedToParseInt {
888
- context : "gas_price_tolerance " ,
899
+ context : "additional_computation_factor " ,
889
900
error,
890
- } ) ?;
901
+ } ) ?
902
+ } ;
891
903
Ok ( PricingMode :: Fixed {
892
904
gas_price_tolerance,
905
+ additional_computation_factor,
893
906
} )
894
907
}
895
908
"reserved" => {
@@ -1689,32 +1702,63 @@ mod tests {
1689
1702
let pricing_mode_str = "fixed" ;
1690
1703
let payment_amount = "" ;
1691
1704
let gas_price_tolerance = "10" ;
1705
+ let additional_computation_factor = "1" ;
1706
+ let standard_payment = "" ;
1707
+ let parsed = pricing_mode (
1708
+ pricing_mode_str,
1709
+ payment_amount,
1710
+ gas_price_tolerance,
1711
+ additional_computation_factor,
1712
+ standard_payment,
1713
+ None ,
1714
+ )
1715
+ . unwrap ( ) ;
1716
+ assert_eq ! (
1717
+ parsed,
1718
+ PricingMode :: Fixed {
1719
+ additional_computation_factor: 1 ,
1720
+ gas_price_tolerance: 10 ,
1721
+ }
1722
+ ) ;
1723
+ }
1724
+
1725
+ #[ test]
1726
+ fn should_parse_fixed_pricing_mode_identifier_without_additional_computation_factor ( ) {
1727
+ let pricing_mode_str = "fixed" ;
1728
+ let payment_amount = "" ;
1729
+ let gas_price_tolerance = "10" ;
1730
+ let additional_computation_factor = "" ;
1692
1731
let standard_payment = "" ;
1693
1732
let parsed = pricing_mode (
1694
1733
pricing_mode_str,
1695
1734
payment_amount,
1696
1735
gas_price_tolerance,
1736
+ additional_computation_factor,
1697
1737
standard_payment,
1698
1738
None ,
1699
1739
)
1700
1740
. unwrap ( ) ;
1701
1741
assert_eq ! (
1702
1742
parsed,
1703
1743
PricingMode :: Fixed {
1744
+ additional_computation_factor: 0 ,
1704
1745
gas_price_tolerance: 10 ,
1705
1746
}
1706
1747
) ;
1707
1748
}
1749
+
1708
1750
#[ test]
1709
1751
fn should_parse_reserved_pricing_mode ( ) {
1710
1752
let pricing_mode_str = "reserved" ;
1711
1753
let payment_amount = "" ;
1712
1754
let gas_price_tolerance = "" ;
1755
+ let additional_computation_factor = "0" ;
1713
1756
let standard_payment = "" ;
1714
1757
let parsed = pricing_mode (
1715
1758
pricing_mode_str,
1716
1759
payment_amount,
1717
1760
gas_price_tolerance,
1761
+ additional_computation_factor,
1718
1762
standard_payment,
1719
1763
Some ( Digest :: from_hex ( VALID_HASH ) . unwrap ( ) ) ,
1720
1764
)
@@ -1732,10 +1776,12 @@ mod tests {
1732
1776
let payment_amount = "10" ;
1733
1777
let standard_payment = "true" ;
1734
1778
let gas_price_tolerance = "10" ;
1779
+ let additional_computation_factor = "0" ;
1735
1780
let parsed = pricing_mode (
1736
1781
pricing_mode_str,
1737
1782
payment_amount,
1738
1783
gas_price_tolerance,
1784
+ additional_computation_factor,
1739
1785
standard_payment,
1740
1786
None ,
1741
1787
)
@@ -1756,27 +1802,50 @@ mod tests {
1756
1802
let payment_amount = "10" ;
1757
1803
let standard_payment = "true" ;
1758
1804
let gas_price_tolerance = "10" ;
1805
+ let additional_computation_factor = "0" ;
1759
1806
let parsed = pricing_mode (
1760
1807
pricing_mode_str,
1761
1808
payment_amount,
1762
1809
gas_price_tolerance,
1810
+ additional_computation_factor,
1763
1811
standard_payment,
1764
1812
None ,
1765
1813
) ;
1766
1814
assert ! ( parsed. is_err( ) ) ;
1767
1815
assert ! ( matches!( parsed, Err ( CliError :: InvalidArgument { .. } ) ) ) ;
1768
1816
}
1769
1817
1818
+ #[ test]
1819
+ fn should_fail_to_parse_invalid_additional_computation_factor ( ) {
1820
+ let pricing_mode_str = "fixed" ;
1821
+ let payment_amount = "10" ;
1822
+ let standard_payment = "true" ;
1823
+ let gas_price_tolerance = "10" ;
1824
+ let additional_computation_factor = "invalid" ;
1825
+ let parsed = pricing_mode (
1826
+ pricing_mode_str,
1827
+ payment_amount,
1828
+ gas_price_tolerance,
1829
+ additional_computation_factor,
1830
+ standard_payment,
1831
+ None ,
1832
+ ) ;
1833
+ assert ! ( parsed. is_err( ) ) ;
1834
+ assert ! ( matches!( parsed, Err ( CliError :: FailedToParseInt { .. } ) ) ) ;
1835
+ }
1836
+
1770
1837
#[ test]
1771
1838
fn should_fail_to_parse_classic_without_amount ( ) {
1772
1839
let pricing_mode_str = "classic" ;
1773
1840
let payment_amount = "" ;
1774
1841
let standard_payment = "true" ;
1775
1842
let gas_price_tolerance = "10" ;
1843
+ let additional_computation_factor = "0" ;
1776
1844
let parsed = pricing_mode (
1777
1845
pricing_mode_str,
1778
1846
payment_amount,
1779
1847
gas_price_tolerance,
1848
+ additional_computation_factor,
1780
1849
standard_payment,
1781
1850
None ,
1782
1851
) ;
0 commit comments