@@ -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