-
Notifications
You must be signed in to change notification settings - Fork 339
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Expose impl_writeable_tlv_based
macro
#1823
Expose impl_writeable_tlv_based
macro
#1823
Conversation
Codecov ReportBase: 90.71% // Head: 90.72% // Increases project coverage by
Additional details and impacted files@@ Coverage Diff @@
## main #1823 +/- ##
=======================================
Coverage 90.71% 90.72%
=======================================
Files 96 96
Lines 50113 50134 +21
Branches 50113 50134 +21
=======================================
+ Hits 45459 45482 +23
+ Misses 4654 4652 -2
Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here. ☔ View full report at Codecov. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Basically fine, needs way more details in the docs, though. If you prefer to not write those just let me know and I can suggest concrete changes.
lightning/src/util/ser_macros.rs
Outdated
// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing | ||
// the message contents. It should return `Ok(true)` if the custom message is successfully parsed, | ||
// `Ok(false)` if the message type is unknown, and `Err(DecodeError)` if parsing fails. | ||
/// Implements the TLVs deserialization part in a Readable implementation of a struct. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, this is confusing, it can be used anywhere, it doesn't have to be in a Readable
implementation - it just happens to return
Err(DecodeError)
so it has to be in a function which does so.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, I wrote this doc based on how the macro was used. But yeah this should be more generic.
lightning/src/util/ser_macros.rs
Outdated
/// `$decode_custom_tlv` is a closure that may be optionally provided to handle custom message types. | ||
/// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing | ||
/// the message contents. It should return `Ok(true)` if the custom message is successfully parsed, | ||
/// `Ok(false)` if the message type is unknown, and `Err(DecodeError)` if parsing fails. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should have an example of how to call it if we're gonna make it for public consumption, including what the option
, required
, etc types mean and how to use them (we can leave off some of the more complicated ones, preferring to just document ones we want to support).
Also needs to note that it will always fully read the stream provided to the end.
lightning/src/util/ser_macros.rs
Outdated
@@ -351,17 +379,21 @@ macro_rules! read_ver_prefix { | |||
} } | |||
} | |||
|
|||
/// Reads a suffix added by write_tlv_fields. | |||
/// Reads a suffix added by write_tlv_fields!(). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I dunno if we need to expose the lenght-prefixed versions of the macros.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aren't {write,read}_tlv_fields
length-prefixed already?
lightning/src/util/ser_macros.rs
Outdated
@@ -28,6 +34,8 @@ macro_rules! encode_tlv { | |||
}; | |||
} | |||
|
|||
/// Implements the TLVs serialization part in a Writeable implementation of a struct. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same comments, basically, apply here - we need to describe what this does, when users should want to use it, and what they need to do to use it, including examples of how to call it with the behavior of the various types spelled out.
@@ -396,11 +431,12 @@ macro_rules! init_tlv_field_var { | |||
/// If $fieldty is `option`, then $field is optional field. | |||
/// if $fieldty is `vec_type`, then $field is a Vec, which needs to have its individual elements | |||
/// serialized. | |||
#[macro_export] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, do you have an immediate need for this? If not we can skip it, but if so the same comments above apply, basically, needs way more docs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough. It'd be nice to add an example for the docs here.
lightning/src/util/ser_macros.rs
Outdated
@@ -28,6 +34,8 @@ macro_rules! encode_tlv { | |||
}; | |||
} | |||
|
|||
/// Implements the TLVs serialization part in a Writeable implementation of a struct. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Implements the TLVs serialization part in a Writeable implementation of a struct. | |
/// Implements the TLVs serialization part in a [`Writeable`] implementation of a struct. |
lightning/src/util/ser_macros.rs
Outdated
} | ||
last_seen = Some($type); | ||
)* | ||
} | ||
} } | ||
} | ||
|
||
macro_rules! get_varint_length_prefixed_tlv_length { | ||
/// Adds the length of the serialized field to a LengthCalculatingWriter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Adds the length of the serialized field to a LengthCalculatingWriter. | |
/// Adds the length of the serialized field to a [`LengthCalculatingWriter`]. |
lightning/src/util/ser_macros.rs
Outdated
@@ -78,32 +90,38 @@ macro_rules! get_varint_length_prefixed_tlv_length { | |||
}; | |||
} | |||
|
|||
macro_rules! encode_varint_length_prefixed_tlv { | |||
/// See the documentation of write_tlv_fields!(). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// See the documentation of write_tlv_fields!(). | |
/// See the documentation of [`write_tlv_fields`]. |
lightning/src/util/ser_macros.rs
Outdated
/// Implements the TLVs deserialization part in a Readable implementation of a struct. | ||
/// | ||
/// `$decode_custom_tlv` is a closure that may be optionally provided to handle custom message types. | ||
/// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing | |
/// If it is provided, it will be called with the custom type and the [`FixedLengthReader`] containing |
Yes please, I spend hours overthinking what would be the best way to write a comment 😞 |
For the
For
|
Sadly we've had a number of PRs that touched serialization macros so this needs rebase now :( |
b5bdfa9
to
32b419c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Generally looks good, just a number of doc nits.
lightning/src/ln/msgs.rs
Outdated
@@ -822,7 +822,7 @@ pub struct CommitmentUpdate { | |||
|
|||
/// Messages could have optional fields to use with extended features | |||
/// As we wish to serialize these differently from Option<T>s (Options get a tag byte, but |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// As we wish to serialize these differently from Option<T>s (Options get a tag byte, but | |
/// As we wish to serialize these differently from `Option<T>`s (`Option`s get a tag byte, but |
lightning/src/ln/msgs.rs
Outdated
@@ -822,7 +822,7 @@ pub struct CommitmentUpdate { | |||
|
|||
/// Messages could have optional fields to use with extended features | |||
/// As we wish to serialize these differently from Option<T>s (Options get a tag byte, but | |||
/// OptionalFeild simply gets Present if there are enough bytes to read into it), we have a | |||
/// OptionalField simply gets Present if there are enough bytes to read into it), we have a |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// OptionalField simply gets Present if there are enough bytes to read into it), we have a | |
/// [`OptionalField`] simply gets `Present` if there are enough bytes to read into it), we have a |
lightning/src/util/ser.rs
Outdated
read: R, | ||
bytes_read: u64, | ||
total_bytes: u64, | ||
} | ||
impl<R: Read> FixedLengthReader<R> { | ||
/// Returns a new FixedLengthReader. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Returns a new FixedLengthReader. | |
/// Returns a new [`FixedLengthReader`]. |
lightning/src/util/ser.rs
Outdated
@@ -94,21 +94,24 @@ impl Writer for LengthCalculatingWriter { | |||
|
|||
/// Essentially std::io::Take but a bit simpler and with a method to walk the underlying stream |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Essentially std::io::Take but a bit simpler and with a method to walk the underlying stream | |
/// Essentially [`std::io::Take`] but a bit simpler and with a method to walk the underlying stream |
lightning/src/util/ser.rs
Outdated
@@ -146,11 +149,13 @@ impl<R: Read> LengthRead for FixedLengthReader<R> { | |||
|
|||
/// A Read which tracks whether any bytes have been read at all. This allows us to distinguish |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// A Read which tracks whether any bytes have been read at all. This allows us to distinguish | |
/// A [`Read`] implementation which tracks whether any bytes have been read at all. This allows us to distinguish |
lightning/src/util/ser.rs
Outdated
pub have_read: bool, | ||
} | ||
impl<R: Read> ReadTrackingReader<R> { | ||
/// Returns a new ReadTrackingReader. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Returns a new ReadTrackingReader. | |
/// Returns a new [`ReadTrackingReader`]. |
lightning/src/util/ser_macros.rs
Outdated
@@ -7,17 +7,24 @@ | |||
// You may not use this file except in accordance with one or both of these | |||
// licenses. | |||
|
|||
macro_rules! encode_tlv { | |||
//! Some macros that implement Readable/Writeable traits for lightning messages. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
//! Some macros that implement Readable/Writeable traits for lightning messages. | |
//! Some macros that implement [`Readable`]/[`Writeable`] traits for lightning messages. |
lightning/src/util/ser_macros.rs
Outdated
@@ -254,9 +376,9 @@ macro_rules! decode_tlv_stream_range { | |||
}, | |||
_ => {}, | |||
} | |||
// As we read types, make sure we hit every required type: | |||
// As we read types, make sure we hit every required type between last_seen_type and typ: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// As we read types, make sure we hit every required type between last_seen_type and typ: | |
// As we read types, make sure we hit every required type `between last_seen_type` and `typ`: |
lightning/src/util/ser_macros.rs
Outdated
@@ -350,12 +472,14 @@ macro_rules! impl_writeable { | |||
/// object. | |||
/// $min_version_that_can_read_this is the minimum reader version which can understand this | |||
/// serialized object. Previous versions will simply err with a | |||
/// DecodeError::UnknownVersion. | |||
/// [`DecodeError::UnknownVersion`]. | |||
/// | |||
/// Updates to either $this_version or $min_version_that_can_read_this should be included in |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Updates to either $this_version or $min_version_that_can_read_this should be included in | |
/// Updates to either `$this_version` or `$min_version_that_can_read_this` should be included in |
lightning/src/util/ser_macros.rs
Outdated
/// serialization logic for this object. This is compared against the | ||
/// $min_version_that_can_read_this added by write_ver_prefix!(). | ||
/// $min_version_that_can_read_this added by [`write_ver_prefix`]. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// $min_version_that_can_read_this added by [`write_ver_prefix`]. | |
/// `$min_version_that_can_read_this` added by [`write_ver_prefix`]. |
Looks like this needs a trivial rebase, any desire to pick it back up this year? |
1f1e432
to
6e3ddac
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks basically good to go from my side, can you squash the fixup commits so that the PR is only a few freestanding commits where later commits don't fix things done in previous commits. https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#squashing-commits is a good guide for it and we generally follow Bitcoin Core contributing guidelines on git.
lightning/src/util/ser.rs
Outdated
read: R, | ||
bytes_read: u64, | ||
total_bytes: u64, | ||
} | ||
impl<R: Read> FixedLengthReader<R> { | ||
/// Returns a new [`FixedLengthReader`]. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: here and the two changes below - tabs not spaces :)
macro_rules! check_encoded_tlv_order { | ||
/// Panics if the last seen TLV type is not numerically less than the TLV type currently being checked. | ||
/// This is exported for use by other exported macros, do not use directly. | ||
#[macro_export] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a number of the dont-use macros that are missing #[doc(hidden)]
.
/// | ||
/// This is the preferred method of adding new fields that old nodes can ignore and still function | ||
/// correctly. | ||
/// | ||
/// [`DecodeError::UnknownRequiredFeature`]: crate::ln::msgs::DecodeError::UnknownRequiredFeature | ||
#[macro_export] | ||
macro_rules! write_tlv_fields { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should mention that this "writes out a length-prefixed TLV stream"
@@ -396,11 +431,12 @@ macro_rules! init_tlv_field_var { | |||
/// If $fieldty is `option`, then $field is optional field. | |||
/// if $fieldty is `vec_type`, then $field is a Vec, which needs to have its individual elements | |||
/// serialized. | |||
#[macro_export] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough. It'd be nice to add an example for the docs here.
I don't really know why GitHub auto removes one review request when I add another :(. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, feel free to squash fix-up commits.
Every exported macro needed to have all the macros used inside it: 1- to be exported as well. 2- be called from the `$crate` namespace so it works in other crates. Some structs in `lightning::util::ser` needed to be made public as they were used inside the exported macros. Use the macros like this: ```Rust lightning::impl_writeable_tlv_based!(...) ```
Types must be unique and monotonically increasing (using < instead of <=)
266a95d
to
0acd5d3
Compare
Every exported macro needed to have all the macros used inside it:
1- be exported as well.
2- be called from the
$crate
namespace so it works in other crates.Some structs in
lightning::util::ser
needed to be made public as they were used inside the exported macros.Usage:
Couldn't cleanly rebase the old PR so here is this one instead.
cc/ @tnull
Closes #1539