miden_node_proto/errors/
mod.rs1use std::any::type_name;
2use std::num::TryFromIntError;
3
4pub 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}