1use futures::io::Error;
2use std::error;
3use std::fmt;
4use tonic::codegen::http;
5
6#[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
99pub type DamlResult<T> = ::std::result::Result<T, DamlError>;