Skip to content

Commit 8addaea

Browse files
committed
descriptors: simplify check_form method signature
1 parent 3072d1a commit 8addaea

File tree

1 file changed

+38
-53
lines changed

1 file changed

+38
-53
lines changed

descriptors/src/compiler/compile.rs

Lines changed: 38 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ use derive::{
3434
Derive, DeriveCompr, DeriveKey, DeriveLegacy, DeriveSet, DeriveXOnly, Keychain, NormalIndex,
3535
XkeyDecodeError, XpubAccount,
3636
};
37-
use indexmap::{indexmap, IndexMap};
3837

3938
use crate::compiler::{DescrAst, DescrParseError, ScriptExpr};
4039
use crate::{
@@ -104,37 +103,34 @@ impl FromStr for NoKey {
104103
pub fn check_forms<'s, K: Display + FromStr>(
105104
ast: ScriptExpr<'s, K>,
106105
ident: &str,
107-
forms: IndexMap<&'static str, &[DescrExpr]>,
108-
) -> Option<(&'static str, Vec<DescrAst<'s, K>>)>
106+
form: &[DescrExpr],
107+
) -> Option<Vec<DescrAst<'s, K>>>
109108
where
110109
K::Err: core::error::Error,
111110
{
112-
for (name, form) in forms {
113-
if ast.name != ident {
114-
continue;
115-
}
116-
let mut iter1 = form.iter();
117-
let mut iter2 = ast.children.iter();
118-
if iter1.by_ref().zip(iter2.by_ref()).any(|(a, b)| !a.check_expr(b)) {
119-
continue;
111+
if ast.name != ident {
112+
return None;
113+
}
114+
let mut iter1 = form.iter();
115+
let mut iter2 = ast.children.iter();
116+
if iter1.by_ref().zip(iter2.by_ref()).any(|(a, b)| !a.check_expr(b)) {
117+
return None;
118+
}
119+
if iter1.count() > 0 {
120+
return None;
121+
}
122+
if form.last() == Some(&DescrExpr::VariadicKey) {
123+
if iter2.any(|d| !DescrExpr::Key.check_expr(d)) {
124+
return None;
120125
}
121-
if iter1.count() > 0 {
122-
continue;
126+
} else if form.last() == Some(&DescrExpr::VariadicLit) {
127+
if iter2.any(|d| !DescrExpr::Lit.check_expr(d)) {
128+
return None;
123129
}
124-
if form.last() == Some(&DescrExpr::VariadicKey) {
125-
if iter2.any(|d| !DescrExpr::Key.check_expr(d)) {
126-
continue;
127-
}
128-
} else if form.last() == Some(&DescrExpr::VariadicLit) {
129-
if iter2.any(|d| !DescrExpr::Lit.check_expr(d)) {
130-
continue;
131-
}
132-
} else if iter2.count() > 0 {
133-
continue;
134-
}
135-
return Some((name, ast.children));
130+
} else if iter2.count() > 0 {
131+
return None;
136132
}
137-
None
133+
Some(ast.children)
138134
}
139135

140136
////////////////////////////////////////
@@ -147,7 +143,7 @@ where K::Err: core::error::Error
147143

148144
fn from_str(s: &str) -> Result<Self, Self::Err> {
149145
let ast = ScriptExpr::<K>::from_str(s)?;
150-
let (_, mut form) = check_forms(ast, "pkh", indexmap! { "" => &[DescrExpr::Key][..] })
146+
let mut form = check_forms(ast, "pkh", &[DescrExpr::Key][..])
151147
.ok_or(DescrParseError::InvalidArgs("pkh"))?;
152148
let Some(DescrAst::Key(key, _)) = form.pop() else {
153149
unreachable!();
@@ -163,7 +159,7 @@ where K::Err: core::error::Error
163159

164160
fn from_str(s: &str) -> Result<Self, Self::Err> {
165161
let ast = ScriptExpr::<K>::from_str(s)?;
166-
let (_, mut form) = check_forms(ast, "wpkh", indexmap! { "" => &[DescrExpr::Key][..] })
162+
let mut form = check_forms(ast, "wpkh", &[DescrExpr::Key][..])
167163
.ok_or(DescrParseError::InvalidArgs("wpkh"))?;
168164
let Some(DescrAst::Key(key, _)) = form.pop() else {
169165
unreachable!();
@@ -179,13 +175,13 @@ where K::Err: core::error::Error
179175

180176
fn from_str(s: &str) -> Result<Self, Self::Err> {
181177
let ast = ScriptExpr::<K>::from_str(s)?;
182-
let (_, mut form) = check_forms(ast, "sh", indexmap! { "" => &[DescrExpr::Script][..] })
178+
let mut form = check_forms(ast, "sh", &[DescrExpr::Script][..])
183179
.ok_or(DescrParseError::InvalidArgs("sh"))?;
184180
let Some(DescrAst::Script(inner)) = form.pop() else {
185181
unreachable!();
186182
};
187183

188-
let (_, mut form) = check_forms(*inner, "wpkh", indexmap! { "" => &[DescrExpr::Key][..] })
184+
let mut form = check_forms(*inner, "wpkh", &[DescrExpr::Key][..])
189185
.ok_or(DescrParseError::InvalidArgs("wpkh"))?;
190186
let Some(DescrAst::Key(key, _)) = form.pop() else {
191187
unreachable!();
@@ -208,28 +204,23 @@ where
208204
{
209205
let ast = ScriptExpr::<K>::from_str(s)?;
210206

211-
let (_, mut form) = check_forms(ast, outer, indexmap! { "" => &[DescrExpr::Script][..] })
207+
let mut form = check_forms(ast, outer, &[DescrExpr::Script][..])
212208
.ok_or(DescrParseError::InvalidArgs(outer))?;
213209
let Some(DescrAst::Script(mut script)) = form.pop() else {
214210
unreachable!();
215211
};
216212

217213
if let Some(medium) = medium {
218-
let (_, mut form) =
219-
check_forms(*script, medium, indexmap! { "" => &[DescrExpr::Script][..] })
220-
.ok_or(DescrParseError::InvalidArgs(medium))?;
214+
let mut form = check_forms(*script, medium, &[DescrExpr::Script][..])
215+
.ok_or(DescrParseError::InvalidArgs(medium))?;
221216
let Some(DescrAst::Script(script2)) = form.pop() else {
222217
unreachable!();
223218
};
224219
script = script2;
225220
}
226221

227-
let (_, mut form) = check_forms(
228-
*script,
229-
inner,
230-
indexmap! { "" => &[DescrExpr::Lit, DescrExpr::VariadicKey][..] },
231-
)
232-
.ok_or(DescrParseError::InvalidArgs(inner))?;
222+
let mut form = check_forms(*script, inner, &[DescrExpr::Lit, DescrExpr::VariadicKey][..])
223+
.ok_or(DescrParseError::InvalidArgs(inner))?;
233224
let DescrAst::Lit(thresh, _) = form.remove(0) else {
234225
unreachable!();
235226
};
@@ -354,7 +345,7 @@ where K::Err: core::error::Error
354345

355346
fn from_str(s: &str) -> Result<Self, Self::Err> {
356347
let ast = ScriptExpr::<K>::from_str(s)?;
357-
let (_, mut form) = check_forms(ast, "tr", indexmap! { "" => &[DescrExpr::Key][..] })
348+
let mut form = check_forms(ast, "tr", &[DescrExpr::Key][..])
358349
.ok_or(DescrParseError::InvalidArgs("tr"))?;
359350
let Some(DescrAst::Key(key, _)) = form.pop() else {
360351
unreachable!();
@@ -372,22 +363,17 @@ where
372363
{
373364
let ast = ScriptExpr::<K>::from_str(s)?;
374365

375-
let (_, mut form) =
376-
check_forms(ast, "tr", indexmap! { "" => &[DescrExpr::Key, DescrExpr::Script][..] })
377-
.ok_or(DescrParseError::InvalidArgs("tr"))?;
366+
let mut form = check_forms(ast, "tr", &[DescrExpr::Key, DescrExpr::Script][..])
367+
.ok_or(DescrParseError::InvalidArgs("tr"))?;
378368
let Some(DescrAst::Script(script)) = form.pop() else {
379369
unreachable!();
380370
};
381371
let Some(DescrAst::Key(internal_key, _)) = form.pop() else {
382372
unreachable!();
383373
};
384374

385-
let (_, mut form) = check_forms(
386-
*script,
387-
inner,
388-
indexmap! { "" => &[DescrExpr::Lit, DescrExpr::VariadicKey][..] },
389-
)
390-
.ok_or(DescrParseError::InvalidArgs(inner))?;
375+
let mut form = check_forms(*script, inner, &[DescrExpr::Lit, DescrExpr::VariadicKey][..])
376+
.ok_or(DescrParseError::InvalidArgs(inner))?;
391377
let DescrAst::Lit(thresh, _) = form.remove(0) else {
392378
unreachable!();
393379
};
@@ -439,9 +425,8 @@ where K::Err: core::error::Error
439425
fn from_str(s: &str) -> Result<Self, Self::Err> {
440426
let ast = ScriptExpr::<K>::from_str(s)?;
441427

442-
let (_, mut form) =
443-
check_forms(ast, "tr", indexmap! { "" => &[DescrExpr::Key, DescrExpr::Tree][..] })
444-
.ok_or(DescrParseError::InvalidArgs("tr"))?;
428+
let mut form = check_forms(ast, "tr", &[DescrExpr::Key, DescrExpr::Tree][..])
429+
.ok_or(DescrParseError::InvalidArgs("tr"))?;
445430
let Some(DescrAst::Key(_internal_key, _)) = form.pop() else {
446431
unreachable!();
447432
};

0 commit comments

Comments
 (0)