use std::{io, sync::Arc};
use thiserror::Error;
use zcash_protocol::value::BalanceError;
#[derive(Error, Copy, Clone, Debug, PartialEq, Eq)]
pub enum RandError {
#[error("failed to generate a secure stream of random bytes")]
FillBytes,
}
#[derive(Error, Copy, Clone, Debug, PartialEq, Eq)]
pub enum NoteError {
#[error("Randomness generation failure")]
InsufficientRandomness(#[from] RandError),
#[error("failed to generate an Orchard note's rho.")]
InvalidRho,
}
#[derive(Error, Copy, Clone, Debug, PartialEq, Eq)]
pub enum NoteCommitmentError {
#[error("Randomness generation failure")]
InsufficientRandomness(#[from] RandError),
#[error("failed to generate a sapling::NoteCommitment from a diversifier")]
InvalidDiversifier,
}
#[derive(Error, Copy, Clone, Debug, PartialEq, Eq)]
pub enum KeyError {
#[error("Randomness generation failure")]
InsufficientRandomness(#[from] RandError),
}
#[derive(Error, Copy, Clone, Debug, PartialEq, Eq)]
pub enum AddressError {
#[error("Randomness generation failure")]
InsufficientRandomness(#[from] RandError),
#[error("Randomness did not hash into the Jubjub group for producing a new diversifier")]
DiversifierGenerationFailure,
}
#[derive(Clone, Error, Debug)]
pub enum Error {
#[error("invalid consensus branch id")]
InvalidConsensusBranchId,
#[error(transparent)]
Io(#[from] Arc<io::Error>),
#[error("the transaction is missing a network upgrade")]
MissingNetworkUpgrade,
#[error(transparent)]
Amount(#[from] BalanceError),
#[error("Zebra's type could not be converted to its librustzcash equivalent: {0}")]
Conversion(String),
}
impl From<io::Error> for Error {
fn from(value: io::Error) -> Self {
Arc::new(value).into()
}
}
impl PartialEq for Error {
fn eq(&self, other: &Self) -> bool {
match self {
Error::InvalidConsensusBranchId => matches!(other, Error::InvalidConsensusBranchId),
Error::Io(e) => {
if let Error::Io(o) = other {
e.to_string() == o.to_string()
} else {
false
}
}
Error::MissingNetworkUpgrade => matches!(other, Error::MissingNetworkUpgrade),
Error::Amount(e) => matches!(other, Error::Amount(o) if e == o),
Error::Conversion(e) => matches!(other, Error::Conversion(o) if e == o),
}
}
}
impl Eq for Error {}