@@ -1461,6 +1461,9 @@ const UPDATE: u16 = 0x1000;
1461
1461
/// [`Self::FeeInsufficient`] is a direct representation of its underlying BOLT04 error code.
1462
1462
/// [`Self::PrivateChannelForward`] provides additional information that is not provided by its
1463
1463
/// BOLT04 error code.
1464
+ //
1465
+ // Note that variants that directly represent BOLT04 error codes must implement conversion from u16
1466
+ // values using [`impl_from_u16_for_htlc_reason`]
1464
1467
#[ derive( Copy , Clone , Debug , Hash , PartialEq , Eq ) ]
1465
1468
pub enum LocalHTLCFailureReason {
1466
1469
/// There has been a temporary processing failure on the node which may resolve on retry.
@@ -1692,57 +1695,49 @@ impl LocalHTLCFailureReason {
1692
1695
}
1693
1696
}
1694
1697
1695
- impl From < u16 > for LocalHTLCFailureReason {
1696
- fn from ( value : u16 ) -> Self {
1697
- if value == ( NODE | 2 ) {
1698
- LocalHTLCFailureReason :: TemporaryNodeFailure
1699
- } else if value == ( PERM | NODE | 2 ) {
1700
- LocalHTLCFailureReason :: PermanentNodeFailure
1701
- } else if value == ( PERM | NODE | 3 ) {
1702
- LocalHTLCFailureReason :: RequiredNodeFeature
1703
- } else if value == ( BADONION | PERM | 4 ) {
1704
- LocalHTLCFailureReason :: InvalidOnionVersion
1705
- } else if value == ( BADONION | PERM | 5 ) {
1706
- LocalHTLCFailureReason :: InvalidOnionHMAC
1707
- } else if value == ( BADONION | PERM | 6 ) {
1708
- LocalHTLCFailureReason :: InvalidOnionKey
1709
- } else if value == ( UPDATE | 7 ) {
1710
- LocalHTLCFailureReason :: TemporaryChannelFailure
1711
- } else if value == ( PERM | 8 ) {
1712
- LocalHTLCFailureReason :: PermanentChannelFailure
1713
- } else if value == ( PERM | 9 ) {
1714
- LocalHTLCFailureReason :: RequiredChannelFeature
1715
- } else if value == ( PERM | 10 ) {
1716
- LocalHTLCFailureReason :: UnknownNextPeer
1717
- } else if value == ( UPDATE | 11 ) {
1718
- LocalHTLCFailureReason :: AmountBelowMinimum
1719
- } else if value == ( UPDATE | 12 ) {
1720
- LocalHTLCFailureReason :: FeeInsufficient
1721
- } else if value == ( UPDATE | 13 ) {
1722
- LocalHTLCFailureReason :: IncorrectCLTVExpiry
1723
- } else if value == ( UPDATE | 14 ) {
1724
- LocalHTLCFailureReason :: CLTVExpiryTooSoon
1725
- } else if value == ( PERM | 15 ) {
1726
- LocalHTLCFailureReason :: IncorrectPaymentDetails
1727
- } else if value == 18 {
1728
- LocalHTLCFailureReason :: FinalIncorrectCLTVExpiry
1729
- } else if value == 19 {
1730
- LocalHTLCFailureReason :: FinalIncorrectHTLCAmount
1731
- } else if value == ( UPDATE | 20 ) {
1732
- LocalHTLCFailureReason :: ChannelDisabled
1733
- } else if value == 21 {
1734
- LocalHTLCFailureReason :: CLTVExpiryTooFar
1735
- } else if value == ( PERM | 22 ) {
1736
- LocalHTLCFailureReason :: InvalidOnionPayload
1737
- } else if value == 23 {
1738
- LocalHTLCFailureReason :: MPPTimeout
1739
- } else if value == ( BADONION | PERM | 24 ) {
1740
- LocalHTLCFailureReason :: InvalidOnionBlinding
1741
- } else {
1742
- LocalHTLCFailureReason :: UnknownFailureCode { code : value }
1743
- }
1744
- }
1745
- }
1698
+ macro_rules! impl_from_u16_for_htlc_reason {
1699
+ ( $enum: ident, [ $( $variant: ident) ,* $( , ) ?] ) => {
1700
+ impl From <u16 > for $enum {
1701
+ fn from( value: u16 ) -> Self {
1702
+ $(
1703
+ if value == $enum:: $variant. failure_code( ) {
1704
+ return $enum:: $variant;
1705
+ }
1706
+ ) *
1707
+ $enum:: UnknownFailureCode { code: value }
1708
+ }
1709
+ }
1710
+ } ;
1711
+ }
1712
+
1713
+ // Error codes that represent BOLT04 error codes must be included here.
1714
+ impl_from_u16_for_htlc_reason ! (
1715
+ LocalHTLCFailureReason ,
1716
+ [
1717
+ TemporaryNodeFailure ,
1718
+ PermanentNodeFailure ,
1719
+ RequiredNodeFeature ,
1720
+ InvalidOnionVersion ,
1721
+ InvalidOnionHMAC ,
1722
+ InvalidOnionKey ,
1723
+ TemporaryChannelFailure ,
1724
+ PermanentChannelFailure ,
1725
+ RequiredChannelFeature ,
1726
+ UnknownNextPeer ,
1727
+ AmountBelowMinimum ,
1728
+ FeeInsufficient ,
1729
+ IncorrectCLTVExpiry ,
1730
+ CLTVExpiryTooSoon ,
1731
+ IncorrectPaymentDetails ,
1732
+ FinalIncorrectCLTVExpiry ,
1733
+ FinalIncorrectHTLCAmount ,
1734
+ ChannelDisabled ,
1735
+ CLTVExpiryTooFar ,
1736
+ InvalidOnionPayload ,
1737
+ MPPTimeout ,
1738
+ InvalidOnionBlinding ,
1739
+ ]
1740
+ ) ;
1746
1741
1747
1742
impl fmt:: Display for LocalHTLCFailureReason {
1748
1743
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
0 commit comments