Skip to main content

miden_node_proto/errors/
mod.rs

1use std::any::type_name;
2use std::num::TryFromIntError;
3
4// Re-export the GrpcError derive macro for convenience
5pub use miden_node_grpc_error_macro::GrpcError;
6use miden_protocol::crypto::merkle::smt::{SmtLeafError, SmtProofError};
7use miden_protocol::errors::{AccountError, AssetError, FeeError, NoteError, StorageSlotNameError};
8use miden_protocol::utils::DeserializationError;
9use miden_standards::note::NetworkAccountTargetError;
10use thiserror::Error;
11
12#[cfg(test)]
13mod test_macro;
14
15#[derive(Debug, Error)]
16pub enum ConversionError {
17    #[error("asset error")]
18    AssetError(#[from] AssetError),
19    #[error("account code missing")]
20    AccountCodeMissing,
21    #[error("account error")]
22    AccountError(#[from] AccountError),
23    #[error("fee parameters error")]
24    FeeError(#[from] FeeError),
25    #[error("hex error")]
26    HexError(#[from] hex::FromHexError),
27    #[error("note error")]
28    NoteError(#[from] NoteError),
29    #[error("network note error")]
30    NetworkNoteError(#[source] NetworkAccountTargetError),
31    #[error("SMT leaf error")]
32    SmtLeafError(#[from] SmtLeafError),
33    #[error("SMT proof error")]
34    SmtProofError(#[from] SmtProofError),
35    #[error("storage slot name error")]
36    StorageSlotNameError(#[from] StorageSlotNameError),
37    #[error("integer conversion error: {0}")]
38    TryFromIntError(#[from] TryFromIntError),
39    #[error("too much data, expected {expected}, got {got}")]
40    TooMuchData { expected: usize, got: usize },
41    #[error("not enough data, expected {expected}, got {got}")]
42    InsufficientData { expected: usize, got: usize },
43    #[error("value is not in the range 0..MODULUS")]
44    NotAValidFelt,
45    #[error("merkle error")]
46    MerkleError(#[from] miden_protocol::crypto::merkle::MerkleError),
47    #[error("field `{entity}::{field_name}` is missing")]
48    MissingFieldInProtobufRepresentation {
49        entity: &'static str,
50        field_name: &'static str,
51    },
52    #[error("failed to deserialize {entity}")]
53    DeserializationError {
54        entity: &'static str,
55        source: DeserializationError,
56    },
57    #[error("enum variant discriminant out of range")]
58    EnumDiscriminantOutOfRange,
59}
60
61impl ConversionError {
62    pub fn deserialization_error(entity: &'static str, source: DeserializationError) -> Self {
63        Self::DeserializationError { entity, source }
64    }
65}
66
67pub trait MissingFieldHelper {
68    fn missing_field(field_name: &'static str) -> ConversionError;
69}
70
71impl<T: prost::Message> MissingFieldHelper for T {
72    fn missing_field(field_name: &'static str) -> ConversionError {
73        ConversionError::MissingFieldInProtobufRepresentation {
74            entity: type_name::<T>(),
75            field_name,
76        }
77    }
78}
79
80impl From<ConversionError> for tonic::Status {
81    fn from(value: ConversionError) -> Self {
82        tonic::Status::invalid_argument(value.to_string())
83    }
84}