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