use crate::Blob;
use anyhow::Context;
use bc_envelope::prelude::*;
#[derive(Clone, PartialEq)]
pub struct UnifiedAddress {
address: String,
diversifier_index: Option<Blob<11>>,
hd_derivation_path: Option<String>,
}
impl std::fmt::Debug for UnifiedAddress {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("UnifiedAddress")
.field("address", &self.address)
.field("diversifier_index", &self.diversifier_index)
.field("hd_derivation_path", &self.hd_derivation_path)
.finish()
}
}
impl UnifiedAddress {
pub fn new(address: String) -> Self {
UnifiedAddress {
address,
diversifier_index: None,
hd_derivation_path: None,
}
}
pub fn from_parts(
address: String,
diversifier_index: Option<Blob<11>>,
hd_derivation_path: Option<String>,
) -> Self {
UnifiedAddress {
address,
diversifier_index,
hd_derivation_path,
}
}
pub fn address(&self) -> &str {
&self.address
}
pub fn set_address(&mut self, address: String) {
self.address = address;
}
pub fn diversifier_index(&self) -> Option<&Blob<11>> {
self.diversifier_index.as_ref()
}
pub fn set_diversifier_index(&mut self, diversifier_index: Blob<11>) {
self.diversifier_index = Some(diversifier_index);
}
pub fn hd_derivation_path(&self) -> Option<&str> {
self.hd_derivation_path.as_deref()
}
pub fn set_hd_derivation_path(&mut self, path: String) {
self.hd_derivation_path = Some(path);
}
}
impl From<UnifiedAddress> for Envelope {
fn from(value: UnifiedAddress) -> Self {
Envelope::new(value.address)
.add_type("UnifiedAddress")
.add_optional_assertion("diversifier_index", value.diversifier_index)
.add_optional_assertion("hd_derivation_path", value.hd_derivation_path)
}
}
impl TryFrom<Envelope> for UnifiedAddress {
type Error = anyhow::Error;
fn try_from(envelope: Envelope) -> Result<Self, Self::Error> {
envelope
.check_type_envelope("UnifiedAddress")
.context("UnifiedAddress")?;
let address = envelope.extract_subject().context("address")?;
let diversifier_index = envelope
.try_optional_object_for_predicate("diversifier_index")
.context("diversifier_index")?;
let hd_derivation_path = envelope
.try_optional_object_for_predicate("hd_derivation_path")
.context("hd_derivation_path")?;
Ok(UnifiedAddress {
address,
diversifier_index,
hd_derivation_path,
})
}
}
#[cfg(test)]
mod tests {
use crate::{Blob, test_envelope_roundtrip};
use super::UnifiedAddress;
impl crate::RandomInstance for UnifiedAddress {
fn random() -> Self {
Self {
address: String::random(),
diversifier_index: Blob::opt_random(),
hd_derivation_path: String::opt_random(),
}
}
}
test_envelope_roundtrip!(UnifiedAddress);
}