]> Untitled Git - bdk/commitdiff
[keys] impl `ToDescriptorKey` for `&str`
authorAlekos Filini <alekos.filini@gmail.com>
Wed, 16 Dec 2020 18:01:16 +0000 (19:01 +0100)
committerAlekos Filini <alekos.filini@gmail.com>
Wed, 16 Dec 2020 18:06:02 +0000 (19:06 +0100)
src/descriptor/dsl.rs
src/keys/mod.rs

index 71f099e5e381e98d111a72d7f54dd95bcac76f7b..2fe370f4ceb92c89996002d63ccd952edb4905f5 100644 (file)
@@ -278,15 +278,20 @@ macro_rules! apply_modifier {
 /// cannot be grouped together. For instance, a descriptor fragment like `sdv:older(144)` has to be
 /// broken up to `s:d:v:older(144)`.
 ///
+/// The `pk()`, `pk_k()` and `pk_h()` operands can take as argument any type that implements
+/// [`ToDescriptorKey`]. This means that keys can also be written inline as strings, but in that
+/// case they must be wrapped in quotes, which is another difference compared to the standard
+/// descriptor syntax.
+///
+/// [`ToDescriptorKey`]: crate::keys::ToDescriptorKey
+///
 /// ## Example
 ///
-/// Signature plus timelock, equivalent to: `sh(wsh(and_v(v:pk(...), older(...))))`
+/// Signature plus timelock descriptor:
 ///
 /// ```
 /// # use std::str::FromStr;
-/// let my_key = bitcoin::PublicKey::from_str("02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c")?;
-/// let my_timelock = 50;
-/// let (my_descriptor, my_keys_map, networks) = bdk::descriptor!(sh(wsh(and_v(v:pk(my_key),older(my_timelock)))))?;
+/// let (my_descriptor, my_keys_map, networks) = bdk::descriptor!(sh(wsh(and_v(v:pk("cVt4o7BGAig1UXywgGSmARhxMdzP5qvQsxKkSsc1XEkw3tDTQFpy"),older(50)))))?;
 /// # Ok::<(), Box<dyn std::error::Error>>(())
 /// ```
 ///
index 807bbe641f2bbc1668f13d01b80ac795e9d0a1a4..d48dba08d57e2465682732636759ee67db79c9d2 100644 (file)
@@ -28,6 +28,7 @@ use std::any::TypeId;
 use std::collections::HashSet;
 use std::marker::PhantomData;
 use std::ops::Deref;
+use std::str::FromStr;
 
 use bitcoin::secp256k1;
 
@@ -661,6 +662,14 @@ impl<Ctx: ScriptContext> ToDescriptorKey<Ctx> for DescriptorSecretKey {
     }
 }
 
+impl<Ctx: ScriptContext> ToDescriptorKey<Ctx> for &'_ str {
+    fn to_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
+        DescriptorSecretKey::from_str(self)
+            .map_err(|e| KeyError::Message(e.to_string()))?
+            .to_descriptor_key()
+    }
+}
+
 impl<Ctx: ScriptContext> ToDescriptorKey<Ctx> for PrivateKey {
     fn to_descriptor_key(self) -> Result<DescriptorKey<Ctx>, KeyError> {
         DescriptorSecretKey::SinglePriv(DescriptorSinglePriv {