daml_grpc/data/
error.rs

1use futures::io::Error;
2use std::error;
3use std::fmt;
4use tonic::codegen::http;
5
6/// A Daml ledger error.
7#[derive(Debug)]
8pub enum DamlError {
9    TimeoutError(Box<DamlError>),
10    GrpcTransportError(tonic::transport::Error),
11    GrpcStatusError(tonic::Status),
12    GrpcPermissionError(tonic::Status),
13    InvalidUriError(http::uri::InvalidUri),
14    StdError(Error),
15    UnexpectedType(String, String),
16    UnknownField(String),
17    ListIndexOutOfRange(usize),
18    MissingRequiredField,
19    UnexpectedVariant(String, String),
20    Other(String),
21    FailedConversion(String),
22    InsufficientParties,
23}
24
25impl DamlError {
26    pub fn new_failed_conversion(msg: impl Into<String>) -> Self {
27        DamlError::FailedConversion(msg.into())
28    }
29
30    pub fn new_timeout_error(inner: DamlError) -> Self {
31        DamlError::TimeoutError(Box::new(inner))
32    }
33}
34
35impl fmt::Display for DamlError {
36    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
37        match self {
38            DamlError::InvalidUriError(e) => write!(fmt, "{}", (e as &dyn error::Error)),
39            DamlError::GrpcTransportError(e) => write!(fmt, "{}", (e as &dyn error::Error)),
40            DamlError::GrpcStatusError(e) => write!(fmt, "{}", (e as &dyn error::Error)),
41            DamlError::GrpcPermissionError(e) => write!(fmt, "{}", (e as &dyn error::Error)),
42            DamlError::StdError(e) => write!(fmt, "{}", (e as &dyn error::Error)),
43            DamlError::UnexpectedType(expected, actual) =>
44                write!(fmt, "unexpected type, expected {} but found {}", expected, actual),
45            DamlError::UnknownField(name) => write!(fmt, "unknown field {}", name),
46            DamlError::ListIndexOutOfRange(index) => write!(fmt, "list index {} out of range", index),
47            DamlError::MissingRequiredField => write!(fmt, "expected optional value is None"),
48            DamlError::UnexpectedVariant(expected, actual) =>
49                write!(fmt, "unexpected variant constructor, expected {} but found {}", expected, actual),
50            DamlError::Other(e) => write!(fmt, "{}", e),
51            DamlError::FailedConversion(e) => write!(fmt, "failed conversion: {}", e),
52            DamlError::TimeoutError(e) => write!(fmt, "timeout error: {}", e),
53            DamlError::InsufficientParties => write!(fmt, "insufficient parties"),
54        }
55    }
56}
57
58impl error::Error for DamlError {}
59
60impl From<tonic::Status> for DamlError {
61    fn from(e: tonic::Status) -> Self {
62        match e.code() {
63            tonic::Code::PermissionDenied | tonic::Code::Unauthenticated => DamlError::GrpcPermissionError(e),
64            _ => DamlError::GrpcStatusError(e),
65        }
66    }
67}
68
69impl From<tonic::transport::Error> for DamlError {
70    fn from(e: tonic::transport::Error) -> Self {
71        DamlError::GrpcTransportError(e)
72    }
73}
74
75impl From<http::uri::InvalidUri> for DamlError {
76    fn from(e: http::uri::InvalidUri) -> Self {
77        DamlError::InvalidUriError(e)
78    }
79}
80
81impl From<&str> for DamlError {
82    fn from(e: &str) -> Self {
83        DamlError::Other(e.to_owned())
84    }
85}
86
87impl From<bigdecimal::ParseBigDecimalError> for DamlError {
88    fn from(e: bigdecimal::ParseBigDecimalError) -> Self {
89        DamlError::FailedConversion(e.to_string())
90    }
91}
92
93impl From<Error> for DamlError {
94    fn from(e: Error) -> Self {
95        DamlError::StdError(e)
96    }
97}
98
99/// A Daml ledger result.
100pub type DamlResult<T> = ::std::result::Result<T, DamlError>;