Skip to content

Commit c554e64

Browse files
committed
Introduce ChannelUpdateDeserWrap
1 parent 141bf0c commit c554e64

File tree

1 file changed

+44
-73
lines changed

1 file changed

+44
-73
lines changed

lightning/src/routing/gossip.rs

Lines changed: 44 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -643,79 +643,50 @@ impl Writeable for ChannelUpdateInfo {
643643
}
644644
}
645645

646-
impl MaybeReadable for ChannelUpdateInfo {
647-
fn read<R: io::Read>(reader: &mut R) -> Result<Option<Self>, DecodeError> {
648-
macro_rules! read_channel_update_tlv_fields {
649-
($reader: expr, {$(($type: expr, $field: ident)),* $(,)*}) => {{
650-
let mut stream_ref = $reader;
651-
$({
652-
if stream_ref.bytes_remain() {
653-
let tlv_type_res: Result<::util::ser::BigSize, DecodeError> = ::util::ser::Readable::read(stream_ref);
654-
$field = if let Ok(ref tlv_type) = tlv_type_res {
655-
println!("GOT TYPE: {}", tlv_type.0);
656-
assert_eq!(tlv_type.0, $type);
657-
658-
let tlv_len_res: Result<::util::ser::BigSize, DecodeError> = ::util::ser::Readable::read(&mut stream_ref);
659-
if let Ok(ref tlv_len) = tlv_len_res {
660-
println!("GOT LEN: {}", tlv_len.0);
661-
let mut s = ::util::ser::FixedLengthReader::new(&mut stream_ref, tlv_len.0);
662-
let tlv_value_res = ::util::ser::Readable::read(&mut s);
663-
let _ = s.eat_remaining();
664-
tlv_value_res.ok()
665-
} else {
666-
None
667-
}
668-
} else {
669-
None
670-
};
671-
}
672-
})*
673-
}};
674-
}
646+
struct ChannelUpdateInfoDeserWrap(ChannelUpdateInfo);
675647

676-
let outer_tlv_len: ::util::ser::BigSize = ::util::ser::Readable::read(reader)?;
677-
if outer_tlv_len.0 == 0 {
678-
return Ok(None);
648+
impl MaybeReadable for ChannelUpdateInfoDeserWrap {
649+
fn read<R: io::Read>(reader: &mut R) -> Result<Option<Self>, DecodeError> {
650+
if let Ok(channel_update) = ::util::ser::Readable::read(reader) {
651+
Ok(Some(Self(channel_update)))
652+
} else {
653+
Ok(None)
679654
}
680-
let mut outer_fixed_reader = ::util::ser::FixedLengthReader::new(reader, outer_tlv_len.0);
681-
655+
}
656+
}
682657

683-
let mut last_update: Option<u32> = None;
684-
let mut enabled: Option<bool> = None;
685-
let mut cltv_expiry_delta: Option<u16> = None;
686-
let mut htlc_minimum_msat: Option<u64> = None;
687-
let mut htlc_maximum_msat: Option<Option<u64>> = None;
688-
let mut fees: Option<RoutingFees> = None;
689-
let mut last_update_message: Option<Option<ChannelUpdate>> = None;
658+
impl Readable for ChannelUpdateInfo {
659+
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
660+
init_tlv_field_var!(last_update, required);
661+
init_tlv_field_var!(enabled, required);
662+
init_tlv_field_var!(cltv_expiry_delta, required);
663+
init_tlv_field_var!(htlc_minimum_msat, required);
664+
init_tlv_field_var!(htlc_maximum_msat, option);
665+
init_tlv_field_var!(fees, required);
666+
init_tlv_field_var!(last_update_message, required);
690667

691-
read_channel_update_tlv_fields!(&mut outer_fixed_reader, {
692-
(0, last_update),
693-
(2, enabled),
694-
(4, cltv_expiry_delta),
695-
(6, htlc_minimum_msat),
696-
(8, htlc_maximum_msat),
697-
(10, fees),
698-
(12, last_update_message),
668+
read_tlv_fields!(reader, {
669+
(0, last_update, required),
670+
(2, enabled, required),
671+
(4, cltv_expiry_delta, required),
672+
(6, htlc_minimum_msat, required),
673+
(8, htlc_maximum_msat, required),
674+
(10, fees, required),
675+
(12, last_update_message, required)
699676
});
700-
let decoding_success = last_update.is_some() && enabled.is_some() &&
701-
cltv_expiry_delta.is_some() && htlc_minimum_msat.is_some() &&
702-
htlc_maximum_msat.is_some() && fees.is_some() &&
703-
last_update_message.is_some();
704-
705-
outer_fixed_reader.eat_remaining()?;
706-
if decoding_success {
707-
println!("DECODING SUCCESS");
708-
Ok(Some(ChannelUpdateInfo {
709-
last_update: last_update.unwrap(),
710-
enabled: enabled.unwrap(),
711-
cltv_expiry_delta: cltv_expiry_delta.unwrap(),
712-
htlc_minimum_msat: htlc_minimum_msat.unwrap(),
713-
htlc_maximum_msat: htlc_maximum_msat.unwrap().unwrap(),
714-
fees: fees.unwrap(),
715-
last_update_message: last_update_message.unwrap(),
716-
}))
677+
678+
if let Some(htlc_maximum_msat) = htlc_maximum_msat {
679+
Ok(ChannelUpdateInfo {
680+
last_update: init_tlv_based_struct_field!(last_update, required),
681+
enabled: init_tlv_based_struct_field!(enabled, required),
682+
cltv_expiry_delta: init_tlv_based_struct_field!(cltv_expiry_delta, required),
683+
htlc_minimum_msat: init_tlv_based_struct_field!(htlc_minimum_msat, required),
684+
htlc_maximum_msat,
685+
fees: init_tlv_based_struct_field!(fees, required),
686+
last_update_message: init_tlv_based_struct_field!(last_update_message, required),
687+
})
717688
} else {
718-
Ok(None)
689+
Err(DecodeError::InvalidValue)
719690
}
720691
}
721692
}
@@ -818,28 +789,28 @@ impl Readable for ChannelInfo {
818789
init_tlv_field_var!(features, required);
819790
init_tlv_field_var!(announcement_received_time, (default_value, 0));
820791
init_tlv_field_var!(node_one, required);
821-
let mut one_to_two = None;
792+
let mut one_to_two_wrap: Option<ChannelUpdateInfoDeserWrap> = None;
822793
init_tlv_field_var!(node_two, required);
823-
let mut two_to_one = None;
794+
let mut two_to_one_wrap: Option<ChannelUpdateInfoDeserWrap> = None;
824795
init_tlv_field_var!(capacity_sats, required);
825796
init_tlv_field_var!(announcement_message, required);
826797
read_tlv_fields!(reader, {
827798
(0, features, required),
828799
(1, announcement_received_time, (default_value, 0)),
829800
(2, node_one, required),
830-
(4, one_to_two, ignorable),
801+
(4, one_to_two_wrap, ignorable),
831802
(6, node_two, required),
832-
(8, two_to_one, ignorable),
803+
(8, two_to_one_wrap, ignorable),
833804
(10, capacity_sats, required),
834805
(12, announcement_message, required),
835806
});
836807

837808
Ok(ChannelInfo {
838809
features: init_tlv_based_struct_field!(features, required),
839810
node_one: init_tlv_based_struct_field!(node_one, required),
840-
one_to_two,
811+
one_to_two: one_to_two_wrap.map(|w| w.0),
841812
node_two: init_tlv_based_struct_field!(node_two, required),
842-
two_to_one,
813+
two_to_one: two_to_one_wrap.map(|w| w.0),
843814
capacity_sats: init_tlv_based_struct_field!(capacity_sats, required),
844815
announcement_message: init_tlv_based_struct_field!(announcement_message, required),
845816
announcement_received_time: init_tlv_based_struct_field!(announcement_received_time, (default_value, 0)),

0 commit comments

Comments
 (0)