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