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 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}