Skip to content

Commit d81b900

Browse files
committed
f - InvoiceRequestContents serialization
1 parent fa76a49 commit d81b900

File tree

3 files changed

+68
-7
lines changed

3 files changed

+68
-7
lines changed

lightning/src/offers/invoice_request.rs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ use bitcoin::secp256k1::PublicKey;
1414
use bitcoin::secp256k1::schnorr::Signature;
1515
use core::convert::TryFrom;
1616
use core::str::FromStr;
17+
use io;
1718
use ln::features::OfferFeatures;
18-
use offers::PayerTlvStream;
19+
use offers::{PayerTlvStream, self};
1920
use offers::merkle::{SignatureTlvStream, self};
20-
use offers::offer::{Amount, OfferContents, OfferTlvStream};
21+
use offers::offer::{Amount, OfferContents, OfferTlvStream, self};
2122
use offers::parse::{Bech32Encode, ParseError, SemanticError};
23+
use util::ser::{Writeable, Writer};
2224

2325
///
2426
pub struct InvoiceRequest {
@@ -45,6 +47,37 @@ impl AsRef<[u8]> for InvoiceRequest {
4547
}
4648
}
4749

50+
impl InvoiceRequestContents {
51+
pub(super) fn as_tlv_stream(&self) -> ReferencedFullInvoiceRequestTlvStream {
52+
let payer = offers::reference::PayerTlvStream {
53+
payer_info: self.payer_info.as_ref().map(Into::into),
54+
};
55+
56+
let offer = self.offer.as_tlv_stream();
57+
58+
let invoice_request = reference::InvoiceRequestTlvStream {
59+
chain: self.chain.as_ref(),
60+
amount: self.amount_msats.map(Into::into),
61+
features: self.features.as_ref(),
62+
quantity: self.quantity.map(Into::into),
63+
payer_id: Some(&self.payer_id),
64+
payer_note: self.payer_note.as_ref().map(Into::into),
65+
};
66+
67+
let signature = merkle::reference::SignatureTlvStream {
68+
signature: self.signature.as_ref(),
69+
};
70+
71+
(payer, offer, invoice_request, signature)
72+
}
73+
}
74+
75+
impl Writeable for InvoiceRequestContents {
76+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
77+
self.as_tlv_stream().write(writer)
78+
}
79+
}
80+
4881
tlv_stream!(struct InvoiceRequestTlvStream {
4982
(80, chain: BlockHash),
5083
(82, amount: u64),
@@ -63,6 +96,13 @@ impl Bech32Encode for InvoiceRequest {
6396
type FullInvoiceRequestTlvStream =
6497
(PayerTlvStream, OfferTlvStream, InvoiceRequestTlvStream, SignatureTlvStream);
6598

99+
type ReferencedFullInvoiceRequestTlvStream<'a> = (
100+
offers::reference::PayerTlvStream<'a>,
101+
offer::reference::OfferTlvStream<'a>,
102+
reference::InvoiceRequestTlvStream<'a>,
103+
merkle::reference::SignatureTlvStream<'a>,
104+
);
105+
66106
impl FromStr for InvoiceRequest {
67107
type Err = ParseError;
68108

lightning/src/offers/offer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ impl OfferContents {
297297
}
298298
}
299299

300-
fn as_tlv_stream(&self) -> reference::OfferTlvStream {
300+
pub(super) fn as_tlv_stream(&self) -> reference::OfferTlvStream {
301301
let (currency, amount) = match &self.amount {
302302
None => (None, None),
303303
Some(Amount::Bitcoin { amount_msats }) => (None, Some(amount_msats.into())),

lightning/src/util/ser_macros.rs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,12 +441,14 @@ macro_rules! tlv_stream {
441441
)*
442442
}
443443

444-
mod reference {
445-
use super::*;
444+
pub(crate) mod reference {
445+
$(
446+
tlv_record_import!($fieldty$(<$gen>)?);
447+
)*
446448

447-
pub(super) struct $name<'a> {
449+
pub(crate) struct $name<'a> {
448450
$(
449-
pub(super) $field: Option<tlv_record_ref_type!($fieldty$(<$gen>)?)>,
451+
pub(crate) $field: Option<tlv_record_ref_type!($fieldty$(<$gen>)?)>,
450452
)*
451453
}
452454

@@ -529,6 +531,25 @@ macro_rules! tlv_record_ref_type {
529531
};
530532
}
531533

534+
macro_rules! tlv_record_import {
535+
(u8) => {};
536+
(u16) => {};
537+
(u32) => {};
538+
(u64) => {};
539+
(char) => {};
540+
(String) => {};
541+
(Vec<$type:ident>) => {
542+
tlv_record_import!($type);
543+
};
544+
($type:ident<$gen:ident>) => {
545+
tlv_record_import!($type);
546+
tlv_record_import!($gen);
547+
};
548+
($type:ident) => {
549+
use super::$type;
550+
};
551+
}
552+
532553
macro_rules! _impl_writeable_tlv_based_enum_common {
533554
($st: ident, $(($variant_id: expr, $variant_name: ident) =>
534555
{$(($type: expr, $field: ident, $fieldty: tt)),* $(,)*}

0 commit comments

Comments
 (0)