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