Skip to content

Commit fe1a6be

Browse files
committed
Implement write_descriptor macro
Currently we have a bunch of places in the code where we create a checksum formatter wrapper then write a descriptor to it then write the checksum. This can all be wrapped up in a macro, has to be a macro because the number of args is variable. This reduces the line count with no real loss of clarity `write_descriptor!` is pretty self explanatory.
1 parent e9eb9b1 commit fe1a6be

File tree

4 files changed

+30
-32
lines changed

4 files changed

+30
-32
lines changed

src/descriptor/bare.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use core::fmt;
1212
use bitcoin::script::{self, PushBytes};
1313
use bitcoin::{Address, Network, ScriptBuf};
1414

15-
use super::checksum::{self, verify_checksum};
16-
use crate::descriptor::DefiniteDescriptorKey;
15+
use super::checksum::verify_checksum;
16+
use crate::descriptor::{write_descriptor, DefiniteDescriptorKey};
1717
use crate::expression::{self, FromTree};
1818
use crate::miniscript::context::{ScriptContext, ScriptContextError};
1919
use crate::miniscript::satisfy::{Placeholder, Satisfaction, Witness};
@@ -156,12 +156,7 @@ impl<Pk: MiniscriptKey> fmt::Debug for Bare<Pk> {
156156
}
157157

158158
impl<Pk: MiniscriptKey> fmt::Display for Bare<Pk> {
159-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
160-
use fmt::Write;
161-
let mut wrapped_f = checksum::Formatter::new(f);
162-
write!(wrapped_f, "{}", self.ms)?;
163-
wrapped_f.write_checksum_if_not_alt()
164-
}
159+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write_descriptor!(f, "{}", self.ms) }
165160
}
166161

167162
impl<Pk: MiniscriptKey> Liftable<Pk> for Bare<Pk> {
@@ -354,10 +349,7 @@ impl<Pk: MiniscriptKey> fmt::Debug for Pkh<Pk> {
354349

355350
impl<Pk: MiniscriptKey> fmt::Display for Pkh<Pk> {
356351
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
357-
use fmt::Write;
358-
let mut wrapped_f = checksum::Formatter::new(f);
359-
write!(wrapped_f, "pkh({})", self.pk)?;
360-
wrapped_f.write_checksum_if_not_alt()
352+
write_descriptor!(f, "pkh({})", self.pk)
361353
}
362354
}
363355

src/descriptor/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,21 @@ impl<Pk: MiniscriptKey> fmt::Display for Descriptor<Pk> {
978978

979979
serde_string_impl_pk!(Descriptor, "a script descriptor");
980980

981+
macro_rules! write_descriptor {
982+
($fmt:expr, $s:literal $(, $args:expr)*) => {
983+
{
984+
use fmt::Write as _;
985+
986+
let mut wrapped_f = $crate::descriptor::checksum::Formatter::new($fmt);
987+
write!(wrapped_f, $s $(, $args)*)?;
988+
wrapped_f.write_checksum_if_not_alt()?;
989+
990+
fmt::Result::Ok(())
991+
}
992+
}
993+
}
994+
pub(crate) use write_descriptor;
995+
981996
#[cfg(test)]
982997
mod tests {
983998
use core::convert::TryFrom;

src/descriptor/segwitv0.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ use core::fmt;
99

1010
use bitcoin::{Address, Network, ScriptBuf};
1111

12-
use super::checksum::{self, verify_checksum};
12+
use super::checksum::verify_checksum;
1313
use super::SortedMultiVec;
14-
use crate::descriptor::DefiniteDescriptorKey;
14+
use crate::descriptor::{write_descriptor, DefiniteDescriptorKey};
1515
use crate::expression::{self, FromTree};
1616
use crate::miniscript::context::{ScriptContext, ScriptContextError};
1717
use crate::miniscript::satisfy::{Placeholder, Satisfaction, Witness};
@@ -260,13 +260,10 @@ impl<Pk: MiniscriptKey> fmt::Debug for Wsh<Pk> {
260260

261261
impl<Pk: MiniscriptKey> fmt::Display for Wsh<Pk> {
262262
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
263-
use fmt::Write;
264-
let mut wrapped_f = checksum::Formatter::new(f);
265263
match self.inner {
266-
WshInner::SortedMulti(ref smv) => write!(wrapped_f, "wsh({})", smv)?,
267-
WshInner::Ms(ref ms) => write!(wrapped_f, "wsh({})", ms)?,
264+
WshInner::SortedMulti(ref smv) => write_descriptor!(f, "wsh({})", smv),
265+
WshInner::Ms(ref ms) => write_descriptor!(f, "wsh({})", ms),
268266
}
269-
wrapped_f.write_checksum_if_not_alt()
270267
}
271268
}
272269

@@ -461,10 +458,7 @@ impl<Pk: MiniscriptKey> fmt::Debug for Wpkh<Pk> {
461458

462459
impl<Pk: MiniscriptKey> fmt::Display for Wpkh<Pk> {
463460
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
464-
use fmt::Write;
465-
let mut wrapped_f = checksum::Formatter::new(f);
466-
write!(wrapped_f, "wpkh({})", self.pk)?;
467-
wrapped_f.write_checksum_if_not_alt()
461+
write_descriptor!(f, "wpkh({})", self.pk)
468462
}
469463
}
470464

src/descriptor/sh.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ use core::fmt;
1313
use bitcoin::script::PushBytes;
1414
use bitcoin::{script, Address, Network, ScriptBuf};
1515

16-
use super::checksum::{self, verify_checksum};
16+
use super::checksum::verify_checksum;
1717
use super::{SortedMultiVec, Wpkh, Wsh};
18-
use crate::descriptor::DefiniteDescriptorKey;
18+
use crate::descriptor::{write_descriptor, DefiniteDescriptorKey};
1919
use crate::expression::{self, FromTree};
2020
use crate::miniscript::context::ScriptContext;
2121
use crate::miniscript::satisfy::{Placeholder, Satisfaction};
@@ -72,15 +72,12 @@ impl<Pk: MiniscriptKey> fmt::Debug for Sh<Pk> {
7272

7373
impl<Pk: MiniscriptKey> fmt::Display for Sh<Pk> {
7474
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
75-
use fmt::Write;
76-
let mut wrapped_f = checksum::Formatter::new(f);
7775
match self.inner {
78-
ShInner::Wsh(ref wsh) => write!(wrapped_f, "sh({:#})", wsh)?,
79-
ShInner::Wpkh(ref pk) => write!(wrapped_f, "sh({:#})", pk)?,
80-
ShInner::SortedMulti(ref smv) => write!(wrapped_f, "sh({})", smv)?,
81-
ShInner::Ms(ref ms) => write!(wrapped_f, "sh({})", ms)?,
76+
ShInner::Wsh(ref wsh) => write_descriptor!(f, "sh({:#})", wsh),
77+
ShInner::Wpkh(ref pk) => write_descriptor!(f, "sh({:#})", pk),
78+
ShInner::SortedMulti(ref smv) => write_descriptor!(f, "sh({})", smv),
79+
ShInner::Ms(ref ms) => write_descriptor!(f, "sh({})", ms),
8280
}
83-
wrapped_f.write_checksum_if_not_alt()
8481
}
8582
}
8683

0 commit comments

Comments
 (0)