use super::TransparentSpendingKey;
use anyhow::{Context, Result, bail};
use bc_envelope::prelude::*;
#[derive(Debug, Clone, PartialEq)]
pub enum TransparentSpendAuthority {
SpendingKey(TransparentSpendingKey),
Derived,
}
impl From<TransparentSpendAuthority> for Envelope {
fn from(value: TransparentSpendAuthority) -> Self {
match value {
TransparentSpendAuthority::SpendingKey(key) => key.into(),
TransparentSpendAuthority::Derived => Envelope::new("Derived"),
}
.add_type("TransparentSpendAuthority")
}
}
impl TryFrom<Envelope> for TransparentSpendAuthority {
type Error = anyhow::Error;
fn try_from(envelope: Envelope) -> Result<Self, Self::Error> {
envelope
.check_type_envelope("TransparentSpendAuthority")
.context("TransparentSpendAuthority")?;
if let Ok(spending_key) = TransparentSpendingKey::try_from(envelope.clone()) {
Ok(TransparentSpendAuthority::SpendingKey(spending_key))
} else if envelope.extract_subject::<String>()? == "Derived" {
Ok(TransparentSpendAuthority::Derived)
} else {
bail!("Invalid TransparentSpendAuthority envelope")
}
}
}
#[cfg(test)]
impl crate::RandomInstance for TransparentSpendAuthority {
fn random() -> Self {
let mut rng = rand::thread_rng();
let a = rand::Rng::gen_range(&mut rng, 0..=1);
if a == 0 {
TransparentSpendAuthority::SpendingKey(TransparentSpendingKey::random())
} else {
TransparentSpendAuthority::Derived
}
}
}
#[cfg(test)]
mod tests {
use crate::test_envelope_roundtrip;
use super::TransparentSpendAuthority;
test_envelope_roundtrip!(TransparentSpendAuthority);
}