Skip to content

Commit de54bff

Browse files
committed
Merge #526: Serde for DescriptorPublicKey
3502477 Serde for DescriptorPublicKey (Scott Robinson) Pull request description: Save me from ever writing the following code again: ```rust pub mod serde_descriptor_key { use std::str::FromStr; use miniscript::DescriptorPublicKey; use serde::{Deserialize, Deserializer, Serializer}; pub fn serialize<S>(dpk: &DescriptorPublicKey, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { serializer.serialize_str(&dpk.to_string()) } pub fn deserialize<'de, D>(deserializer: D) -> Result<DescriptorPublicKey, D::Error> where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; DescriptorPublicKey::from_str(&s).map_err(serde::de::Error::custom) } } ``` ACKs for top commit: apoelstra: ACK 3502477 sanket1729: ACK 3502477 Tree-SHA512: 0d4c13f9944d1419baf76b1443daf8f1d200b1901c7510bb44cca16967bf71a9d44825e758984ae45bc8f7a47534455b99cc355f9e421c08c3b9d32dcc677be4
2 parents 3da37c8 + 3502477 commit de54bff

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ actual-serde = { package = "serde", version = "1.0", optional = true }
3333
bitcoind = { version = "0.27.0", features=["23_0"] }
3434
actual-rand = { package = "rand", version = "0.8.4"}
3535
secp256k1 = {version = "0.24.0", features = ["rand-std"]}
36+
serde_test = "1.0.147"
3637

3738
[[example]]
3839
name = "htlc"

src/descriptor/key.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ use bitcoin::util::bip32;
1212
use bitcoin::{self, XOnlyPublicKey, XpubIdentifier};
1313

1414
use crate::prelude::*;
15+
#[cfg(feature = "serde")]
16+
use crate::serde::{Deserialize, Deserializer, Serialize, Serializer};
1517
use crate::{hash256, MiniscriptKey, ToPublicKey};
1618

1719
/// The descriptor pubkey, either a single pubkey or an xpub.
@@ -1150,12 +1152,35 @@ impl Borrow<DescriptorPublicKey> for DefiniteDescriptorKey {
11501152
}
11511153
}
11521154

1155+
#[cfg(feature = "serde")]
1156+
impl<'de> Deserialize<'de> for DescriptorPublicKey {
1157+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1158+
where
1159+
D: Deserializer<'de>,
1160+
{
1161+
let s = String::deserialize(deserializer)?;
1162+
DescriptorPublicKey::from_str(&s).map_err(crate::serde::de::Error::custom)
1163+
}
1164+
}
1165+
1166+
#[cfg(feature = "serde")]
1167+
impl Serialize for DescriptorPublicKey {
1168+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1169+
where
1170+
S: Serializer,
1171+
{
1172+
serializer.serialize_str(&self.to_string())
1173+
}
1174+
}
1175+
11531176
#[cfg(test)]
11541177
mod test {
11551178
use core::str::FromStr;
11561179

11571180
use bitcoin::secp256k1;
11581181
use bitcoin::util::bip32;
1182+
#[cfg(feature = "serde")]
1183+
use serde_test::{assert_tokens, Token};
11591184

11601185
use super::{
11611186
DescriptorKeyParseError, DescriptorMultiXKey, DescriptorPublicKey, DescriptorSecretKey,
@@ -1534,4 +1559,12 @@ mod test {
15341559
DescriptorPublicKey::from_str("tpubDBrgjcxBxnXyL575sHdkpKohWu5qHKoQ7TJXKNrYznh5fVEGBv89hA8ENW7A8MFVpFUSvgLqc4Nj1WZcpePX6rrxviVtPowvMuGF5rdT2Vi/2/4/<;1>").unwrap_err();
15351560
DescriptorPublicKey::from_str("tpubDBrgjcxBxnXyL575sHdkpKohWu5qHKoQ7TJXKNrYznh5fVEGBv89hA8ENW7A8MFVpFUSvgLqc4Nj1WZcpePX6rrxviVtPowvMuGF5rdT2Vi/2/4/<0;1;>").unwrap_err();
15361561
}
1562+
1563+
#[test]
1564+
#[cfg(feature = "serde")]
1565+
fn test_descriptor_public_key_serde() {
1566+
let desc = "[abcdef00/0'/1']tpubDBrgjcxBxnXyL575sHdkpKohWu5qHKoQ7TJXKNrYznh5fVEGBv89hA8ENW7A8MFVpFUSvgLqc4Nj1WZcpePX6rrxviVtPowvMuGF5rdT2Vi/2";
1567+
let public_key = DescriptorPublicKey::from_str(desc).unwrap();
1568+
assert_tokens(&public_key, &[Token::String(desc)]);
1569+
}
15371570
}

0 commit comments

Comments
 (0)