Skip to content

Commit 75417d3

Browse files
committed
expression: encapsulate fields
1 parent 0576007 commit 75417d3

File tree

10 files changed

+199
-184
lines changed

10 files changed

+199
-184
lines changed

src/descriptor/bare.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -336,15 +336,15 @@ impl<Pk: MiniscriptKey> Liftable<Pk> for Pkh<Pk> {
336336
impl_from_tree!(
337337
Pkh<Pk>,
338338
fn from_tree(top: &expression::Tree) -> Result<Self, Error> {
339-
if top.name == "pkh" && top.args.len() == 1 {
340-
Ok(Pkh::new(expression::terminal(&top.args[0], |pk| {
339+
if top.name() == "pkh" && top.n_args() == 1 {
340+
Ok(Pkh::new(expression::terminal(&top.args()[0], |pk| {
341341
Pk::from_str(pk)
342342
})?)?)
343343
} else {
344344
Err(Error::Unexpected(format!(
345345
"{}({} args) while parsing pkh descriptor",
346-
top.name,
347-
top.args.len(),
346+
top.name(),
347+
top.n_args(),
348348
)))
349349
}
350350
}

src/descriptor/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,7 @@ impl_from_tree!(
891891
Descriptor<Pk>,
892892
/// Parse an expression tree into a descriptor.
893893
fn from_tree(top: &expression::Tree) -> Result<Descriptor<Pk>, Error> {
894-
Ok(match (top.name, top.args.len() as u32) {
894+
Ok(match (top.name(), top.n_args() as u32) {
895895
("pkh", 1) => Descriptor::Pkh(Pkh::from_tree(top)?),
896896
("wpkh", 1) => Descriptor::Wpkh(Wpkh::from_tree(top)?),
897897
("sh", 1) => Descriptor::Sh(Sh::from_tree(top)?),

src/descriptor/segwitv0.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,9 @@ impl<Pk: MiniscriptKey> Liftable<Pk> for Wsh<Pk> {
213213
impl_from_tree!(
214214
Wsh<Pk>,
215215
fn from_tree(top: &expression::Tree) -> Result<Self, Error> {
216-
if top.name == "wsh" && top.args.len() == 1 {
217-
let top = &top.args[0];
218-
if top.name == "sortedmulti" {
216+
if top.name() == "wsh" && top.n_args() == 1 {
217+
let top = &top.args()[0];
218+
if top.name() == "sortedmulti" {
219219
return Ok(Wsh {
220220
inner: WshInner::SortedMulti(SortedMultiVec::from_tree(top)?),
221221
});
@@ -228,8 +228,8 @@ impl_from_tree!(
228228
} else {
229229
Err(Error::Unexpected(format!(
230230
"{}({} args) while parsing wsh descriptor",
231-
top.name,
232-
top.args.len(),
231+
top.name(),
232+
top.n_args(),
233233
)))
234234
}
235235
}
@@ -443,15 +443,15 @@ impl<Pk: MiniscriptKey> Liftable<Pk> for Wpkh<Pk> {
443443
impl_from_tree!(
444444
Wpkh<Pk>,
445445
fn from_tree(top: &expression::Tree) -> Result<Self, Error> {
446-
if top.name == "wpkh" && top.args.len() == 1 {
447-
Ok(Wpkh::new(expression::terminal(&top.args[0], |pk| {
446+
if top.name() == "wpkh" && top.n_args() == 1 {
447+
Ok(Wpkh::new(expression::terminal(&top.args()[0], |pk| {
448448
Pk::from_str(pk)
449449
})?)?)
450450
} else {
451451
Err(Error::Unexpected(format!(
452452
"{}({} args) while parsing wpkh descriptor",
453-
top.name,
454-
top.args.len(),
453+
top.name(),
454+
top.n_args(),
455455
)))
456456
}
457457
}

src/descriptor/sh.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ impl<Pk: MiniscriptKey> fmt::Display for Sh<Pk> {
8585
impl_from_tree!(
8686
Sh<Pk>,
8787
fn from_tree(top: &expression::Tree) -> Result<Self, Error> {
88-
if top.name == "sh" && top.args.len() == 1 {
89-
let top = &top.args[0];
90-
let inner = match top.name {
88+
if top.name() == "sh" && top.n_args() == 1 {
89+
let top = &top.args()[0];
90+
let inner = match top.name() {
9191
"wsh" => ShInner::Wsh(Wsh::from_tree(top)?),
9292
"wpkh" => ShInner::Wpkh(Wpkh::from_tree(top)?),
9393
"sortedmulti" => ShInner::SortedMulti(SortedMultiVec::from_tree(top)?),
@@ -101,8 +101,8 @@ impl_from_tree!(
101101
} else {
102102
Err(Error::Unexpected(format!(
103103
"{}({} args) while parsing sh descriptor",
104-
top.name,
105-
top.args.len(),
104+
top.name(),
105+
top.n_args(),
106106
)))
107107
}
108108
}

src/descriptor/sortedmulti.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,16 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> SortedMultiVec<Pk, Ctx> {
6464
Pk: FromStr,
6565
<Pk as FromStr>::Err: ToString,
6666
{
67-
if tree.args.is_empty() {
67+
if tree.args().is_empty() {
6868
return Err(errstr("no arguments given for sortedmulti"));
6969
}
70-
let k = expression::parse_num(tree.args[0].name)?;
71-
if k > (tree.args.len() - 1) as u32 {
70+
let k = expression::parse_num(tree.args()[0].name())?;
71+
if k > (tree.n_args() - 1) as u32 {
7272
return Err(errstr(
7373
"higher threshold than there were keys in sortedmulti",
7474
));
7575
}
76-
let pks: Result<Vec<Pk>, _> = tree.args[1..]
76+
let pks: Result<Vec<Pk>, _> = tree.args()[1..]
7777
.iter()
7878
.map(|sub| expression::terminal(sub, Pk::from_str))
7979
.collect();

src/descriptor/tr.rs

+26-96
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ use crate::policy::Liftable;
1919
use crate::prelude::*;
2020
use crate::util::{varint_len, witness_size};
2121
use crate::{
22-
errstr, Error, ForEachKey, MiniscriptKey, Satisfier, ScriptContext, Tap, ToPublicKey,
23-
TranslateErr, TranslatePk, Translator,
22+
Error, ForEachKey, MiniscriptKey, Satisfier, ScriptContext, Tap, ToPublicKey, TranslateErr,
23+
TranslatePk, Translator,
2424
};
2525

2626
/// A Taproot Tree representation.
@@ -424,62 +424,60 @@ impl_block_str!(
424424
Tr<Pk>,
425425
// Helper function to parse taproot script path
426426
fn parse_tr_script_spend(tree: &expression::Tree,) -> Result<TapTree<Pk>, Error> {
427-
match tree {
428-
expression::Tree { name, args } if !name.is_empty() && args.is_empty() => {
429-
let script = Miniscript::<Pk, Tap>::from_str(name)?;
430-
Ok(TapTree::Leaf(Arc::new(script)))
431-
}
432-
expression::Tree { name, args } if name.is_empty() && args.len() == 2 => {
433-
let left = Self::parse_tr_script_spend(&args[0])?;
434-
let right = Self::parse_tr_script_spend(&args[1])?;
435-
Ok(TapTree::Tree(Arc::new(left), Arc::new(right)))
436-
}
437-
_ => Err(Error::Unexpected(
427+
if tree.name() != "" && tree.n_args() == 0 {
428+
let script = Miniscript::<Pk, Tap>::from_str(tree.name())?;
429+
Ok(TapTree::Leaf(Arc::new(script)))
430+
} else if tree.name() == "" && tree.n_args() == 2 {
431+
let left = Self::parse_tr_script_spend(&tree.args()[0])?;
432+
let right = Self::parse_tr_script_spend(&tree.args()[1])?;
433+
Ok(TapTree::Tree(Arc::new(left), Arc::new(right)))
434+
} else {
435+
Err(Error::Unexpected(
438436
"unknown format for script spending paths while parsing taproot descriptor"
439437
.to_string(),
440-
)),
438+
))
441439
}
442440
}
443441
);
444442

445443
impl_from_tree!(
446444
Tr<Pk>,
447445
fn from_tree(top: &expression::Tree) -> Result<Self, Error> {
448-
if top.name == "tr" {
449-
match top.args.len() {
446+
if top.name() == "tr" {
447+
match top.n_args() {
450448
1 => {
451-
let key = &top.args[0];
452-
if !key.args.is_empty() {
449+
let key = &top.args()[0];
450+
if !key.args().is_empty() {
453451
return Err(Error::Unexpected(format!(
454452
"#{} script associated with `key-path` while parsing taproot descriptor",
455-
key.args.len()
453+
key.n_args()
456454
)));
457455
}
458456
Tr::new(expression::terminal(key, Pk::from_str)?, None)
459457
}
460458
2 => {
461-
let key = &top.args[0];
462-
if !key.args.is_empty() {
459+
let key = &top.args()[0];
460+
if !key.args().is_empty() {
463461
return Err(Error::Unexpected(format!(
464462
"#{} script associated with `key-path` while parsing taproot descriptor",
465-
key.args.len()
463+
key.args().len()
466464
)));
467465
}
468-
let tree = &top.args[1];
466+
let tree = &top.args()[1];
469467
let ret = Self::parse_tr_script_spend(tree)?;
470468
Tr::new(expression::terminal(key, Pk::from_str)?, Some(ret))
471469
}
472470
_ => Err(Error::Unexpected(format!(
473471
"{}[#{} args] while parsing taproot descriptor",
474-
top.name,
475-
top.args.len()
472+
top.name(),
473+
top.n_args()
476474
))),
477475
}
478476
} else {
479477
Err(Error::Unexpected(format!(
480478
"{}[#{} args] while parsing taproot descriptor",
481-
top.name,
482-
top.args.len()
479+
top.name(),
480+
top.n_args()
483481
)))
484482
}
485483
}
@@ -490,7 +488,7 @@ impl_from_str!(
490488
type Err = Error;,
491489
fn from_str(s: &str) -> Result<Self, Self::Err> {
492490
let desc_str = verify_checksum(s)?;
493-
let top = parse_tr_tree(desc_str)?;
491+
let top = expression::Tree::from_str_tr(desc_str)?;
494492
Self::from_tree(&top)
495493
}
496494
);
@@ -517,74 +515,6 @@ impl<Pk: MiniscriptKey> fmt::Display for Tr<Pk> {
517515
}
518516
}
519517

520-
// Helper function to parse string into miniscript tree form
521-
fn parse_tr_tree(s: &str) -> Result<expression::Tree, Error> {
522-
for ch in s.bytes() {
523-
if !ch.is_ascii() {
524-
return Err(Error::Unprintable(ch));
525-
}
526-
}
527-
528-
if s.len() > 3 && &s[..3] == "tr(" && s.as_bytes()[s.len() - 1] == b')' {
529-
let rest = &s[3..s.len() - 1];
530-
if !rest.contains(',') {
531-
let internal_key = expression::Tree {
532-
name: rest,
533-
args: vec![],
534-
};
535-
return Ok(expression::Tree {
536-
name: "tr",
537-
args: vec![internal_key],
538-
});
539-
}
540-
// use str::split_once() method to refactor this when compiler version bumps up
541-
let (key, script) = split_once(rest, ',')
542-
.ok_or_else(|| Error::BadDescriptor("invalid taproot descriptor".to_string()))?;
543-
544-
let internal_key = expression::Tree {
545-
name: key,
546-
args: vec![],
547-
};
548-
if script.is_empty() {
549-
return Ok(expression::Tree {
550-
name: "tr",
551-
args: vec![internal_key],
552-
});
553-
}
554-
let (tree, rest) = expression::Tree::from_slice_delim(script, 1, '{')?;
555-
if rest.is_empty() {
556-
Ok(expression::Tree {
557-
name: "tr",
558-
args: vec![internal_key, tree],
559-
})
560-
} else {
561-
Err(errstr(rest))
562-
}
563-
} else {
564-
Err(Error::Unexpected("invalid taproot descriptor".to_string()))
565-
}
566-
}
567-
568-
fn split_once(inp: &str, delim: char) -> Option<(&str, &str)> {
569-
if inp.is_empty() {
570-
None
571-
} else {
572-
let mut found = inp.len();
573-
for (idx, ch) in inp.chars().enumerate() {
574-
if ch == delim {
575-
found = idx;
576-
break;
577-
}
578-
}
579-
// No comma or trailing comma found
580-
if found >= inp.len() - 1 {
581-
Some((inp, ""))
582-
} else {
583-
Some((&inp[..found], &inp[found + 1..]))
584-
}
585-
}
586-
}
587-
588518
impl<Pk: MiniscriptKey> Liftable<Pk> for TapTree<Pk> {
589519
fn lift(&self) -> Result<Policy<Pk>, Error> {
590520
fn lift_helper<Pk: MiniscriptKey>(s: &TapTree<Pk>) -> Result<Policy<Pk>, Error> {

0 commit comments

Comments
 (0)