Skip to content

Commit 3072d1a

Browse files
committed
descriptors: add NoKey type used in parsing
1 parent b5430a6 commit 3072d1a

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

descriptors/src/compiler/compile.rs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,16 @@
2424

2525
use core::fmt::Display;
2626
use core::str::FromStr;
27+
use std::collections::BTreeSet;
2728
use std::fmt::Debug;
29+
use std::iter;
2830

2931
use amplify::confinement::ConfinedVec;
3032
use amplify::num::u4;
31-
use derive::{DeriveCompr, DeriveLegacy, DeriveSet, DeriveXOnly};
33+
use derive::{
34+
Derive, DeriveCompr, DeriveKey, DeriveLegacy, DeriveSet, DeriveXOnly, Keychain, NormalIndex,
35+
XkeyDecodeError, XpubAccount,
36+
};
3237
use indexmap::{indexmap, IndexMap};
3338

3439
use crate::compiler::{DescrAst, DescrParseError, ScriptExpr};
@@ -61,6 +66,41 @@ impl DescrExpr {
6166
}
6267
}
6368

69+
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Display)]
70+
#[display("")]
71+
pub struct NoKey;
72+
impl DeriveSet for NoKey {
73+
type Legacy = Self;
74+
type Compr = Self;
75+
type XOnly = Self;
76+
}
77+
impl<K> Derive<K> for NoKey {
78+
fn default_keychain(&self) -> Keychain {
79+
unreachable!();
80+
}
81+
fn keychains(&self) -> BTreeSet<Keychain> {
82+
unreachable!();
83+
}
84+
fn derive(
85+
&self,
86+
_keychain: impl Into<Keychain>,
87+
_index: impl Into<NormalIndex>,
88+
) -> impl Iterator<Item = K> {
89+
iter::empty()
90+
}
91+
}
92+
impl<K> DeriveKey<K> for NoKey {
93+
fn xpub_spec(&self) -> &XpubAccount {
94+
unreachable!();
95+
}
96+
}
97+
impl FromStr for NoKey {
98+
type Err = XkeyDecodeError;
99+
fn from_str(s: &str) -> Result<Self, Self::Err> {
100+
Err(XkeyDecodeError::WrongExtendedKeyLength(s.len()))
101+
}
102+
}
103+
64104
pub fn check_forms<'s, K: Display + FromStr>(
65105
ast: ScriptExpr<'s, K>,
66106
ident: &str,

descriptors/src/compiler/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@ mod lexer;
2626
mod parser;
2727
mod compile;
2828

29+
pub use compile::{check_forms, NoKey};
2930
pub use lexer::{parse_descr_str, DescrLexerError, DescrToken};
3031
pub use parser::{DescrAst, DescrParseError, ScriptExpr, TreeExpr};

descriptors/src/compiler/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use super::{parse_descr_str, DescrLexerError, DescrToken};
3434
impl<'s, K: Display + FromStr> ScriptExpr<'s, K>
3535
where K::Err: core::error::Error
3636
{
37-
pub(super) fn from_str(s: &'s str) -> Result<Self, DescrParseError<K::Err>> {
37+
pub fn from_str(s: &'s str) -> Result<Self, DescrParseError<K::Err>> {
3838
let tokens = parse_descr_str(s)?;
3939
Self::parse_tokens(s, &tokens)
4040
}

0 commit comments

Comments
 (0)