use std::fmt::Display;
use std::io;
use std::str::FromStr;
use miniscript::descriptor::DescriptorSinglePub;
use miniscript::{policy, Descriptor, Miniscript, MiniscriptKey};
use crate::{Error, StrictDecode, StrictEncode};
impl StrictEncode for DescriptorSinglePub {
#[inline]
fn strict_encode<E: io::Write>(&self, mut e: E) -> Result<usize, Error> {
Ok(strict_encode_list!(e; self.key, self.origin))
}
}
impl StrictDecode for DescriptorSinglePub {
#[inline]
fn strict_decode<D: io::Read>(mut d: D) -> Result<Self, Error> {
Ok(strict_decode_self!(d; key, origin; crate))
}
}
impl<Pk> StrictEncode for policy::Concrete<Pk>
where
Pk: MiniscriptKey + FromStr,
{
fn strict_encode<E: io::Write>(&self, e: E) -> Result<usize, Error> {
self.to_string().strict_encode(e)
}
}
impl<Pk> StrictDecode for policy::Concrete<Pk>
where
Pk: MiniscriptKey + FromStr,
<Pk as FromStr>::Err: Display,
<Pk as MiniscriptKey>::Hash: FromStr,
<<Pk as MiniscriptKey>::Hash as FromStr>::Err: Display,
{
fn strict_decode<D: io::Read>(d: D) -> Result<Self, Error> {
String::strict_decode(d)?.parse().map_err(|_| {
Error::DataIntegrityError(s!("Unparsable miniscript policy string"))
})
}
}
impl<Pk, Ctx> StrictEncode for Miniscript<Pk, Ctx>
where
Pk: MiniscriptKey + FromStr,
Ctx: miniscript::ScriptContext,
{
fn strict_encode<E: io::Write>(&self, e: E) -> Result<usize, Error> {
self.to_string().strict_encode(e)
}
}
impl<Pk, Ctx> StrictDecode for Miniscript<Pk, Ctx>
where
Pk: MiniscriptKey + FromStr,
<Pk as FromStr>::Err: Display,
<Pk as MiniscriptKey>::Hash: FromStr,
<<Pk as MiniscriptKey>::Hash as FromStr>::Err: Display,
Ctx: miniscript::ScriptContext,
{
fn strict_decode<D: io::Read>(d: D) -> Result<Self, Error> {
String::strict_decode(d)?.parse().map_err(|_| {
Error::DataIntegrityError(s!("Can't parse miniscript string"))
})
}
}
impl<Pk> StrictEncode for Descriptor<Pk>
where
Pk: MiniscriptKey + FromStr,
{
fn strict_encode<E: io::Write>(&self, e: E) -> Result<usize, Error> {
self.to_string().strict_encode(e)
}
}
impl<Pk> StrictDecode for Descriptor<Pk>
where
Pk: MiniscriptKey + FromStr,
<Pk as FromStr>::Err: Display,
<Pk as MiniscriptKey>::Hash: FromStr,
<<Pk as MiniscriptKey>::Hash as FromStr>::Err: Display,
{
fn strict_decode<D: io::Read>(d: D) -> Result<Self, Error> {
String::strict_decode(d)?.parse().map_err(|_| {
Error::DataIntegrityError(s!("Can't parse descriptor string"))
})
}
}