zebra_chain/serialization/
error.rs1use std::{array::TryFromSliceError, io, num::TryFromIntError, str::Utf8Error, sync::Arc};
4
5use hex::FromHexError;
6use thiserror::Error;
7
8#[derive(Clone, Error, Debug)]
11pub enum SerializationError {
12 #[error("io error: {0}")]
14 Io(#[from] Arc<io::Error>),
15
16 #[error("parse error: {0}")]
19 Parse(&'static str),
20
21 #[error("string was not UTF-8: {0}")]
25 Utf8Error(#[from] Utf8Error),
26
27 #[error("slice was the wrong length: {0}")]
29 TryFromSliceError(#[from] TryFromSliceError),
30
31 #[error("CompactSize too large: {0}")]
33 TryFromIntError(#[from] TryFromIntError),
34
35 #[error("string was not hex: {0}")]
37 FromHexError(#[from] FromHexError),
38
39 #[error("input couldn't be parsed as a zatoshi `Amount`: {source}")]
41 Amount {
42 #[from]
44 source: crate::amount::Error,
45 },
46
47 #[error("transaction balance is non-zero but doesn't have Sapling shielded spends or outputs")]
52 BadTransactionBalance,
53}
54
55impl From<SerializationError> for io::Error {
56 fn from(e: SerializationError) -> Self {
57 match e {
58 SerializationError::Io(e) => {
59 Arc::try_unwrap(e).unwrap_or_else(|e| io::Error::new(e.kind(), e.to_string()))
60 }
61 SerializationError::Parse(msg) => io::Error::new(io::ErrorKind::InvalidData, msg),
62 SerializationError::Utf8Error(e) => io::Error::new(io::ErrorKind::InvalidData, e),
63 SerializationError::TryFromSliceError(e) => {
64 io::Error::new(io::ErrorKind::InvalidData, e)
65 }
66 SerializationError::TryFromIntError(e) => io::Error::new(io::ErrorKind::InvalidData, e),
67 SerializationError::FromHexError(e) => io::Error::new(io::ErrorKind::InvalidData, e),
68 SerializationError::Amount { source } => {
69 io::Error::new(io::ErrorKind::InvalidData, source)
70 }
71 SerializationError::BadTransactionBalance => io::Error::new(
72 io::ErrorKind::InvalidData,
73 "bad transaction balance: non-zero with no Sapling shielded spends or outputs",
74 ),
75 }
76 }
77}
78
79impl From<crate::Error> for SerializationError {
80 fn from(e: crate::Error) -> Self {
81 match e {
82 crate::Error::InvalidConsensusBranchId => Self::Parse("invalid consensus branch id"),
83 crate::Error::Io(e) => Self::Io(e),
84 crate::Error::MissingNetworkUpgrade => Self::Parse("missing network upgrade"),
85 crate::Error::Amount(_) => Self::BadTransactionBalance,
86 crate::Error::Conversion(_) => {
87 Self::Parse("Zebra's type could not be converted to its librustzcash equivalent")
88 }
89 }
90 }
91}
92
93impl From<io::Error> for SerializationError {
96 fn from(value: io::Error) -> Self {
97 Arc::new(value).into()
98 }
99}