1use std::fmt::{Display, Formatter};
2
3use tonic::transport::Error;
4use tonic::Status;
5
6#[derive(thiserror::Error, Debug)]
7pub enum ParseErrorKind {
8 #[error("invalid syntax: '{0}'")]
9 InvalidSyntax(String),
10}
11
12#[derive(thiserror::Error, Debug)]
13#[error("'{value}' has invalid syntax for {item} {source}")]
14pub struct ParseError {
15 item: String,
16 value: String,
17 source: ParseErrorKind,
18}
19
20impl ParseError {
21 pub(crate) fn invalid_syntax(item: &str, value: impl Into<String>, reason: &str) -> Self {
22 ParseError {
23 item: item.into(),
24 value: value.into(),
25 source: ParseErrorKind::InvalidSyntax(reason.into()),
26 }
27 }
28}
29
30#[derive(Debug)]
31pub struct ConnectError(pub(super) Error);
32
33impl Display for ConnectError {
34 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
35 write!(f, "connect to check service")
36 }
37}
38
39impl std::error::Error for ConnectError {
40 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
41 Some(&self.0)
42 }
43}
44
45#[derive(Debug)]
46pub struct WriteError(pub(super) Status);
47
48impl Display for WriteError {
49 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
50 write!(
51 f,
52 "write tuples grpc call: {:?}: {}",
53 self.0.code(),
54 self.0.message()
55 )
56 }
57}
58
59impl std::error::Error for WriteError {
60 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
61 Some(&self.0)
62 }
63}
64
65impl From<Status> for WriteError {
66 fn from(value: Status) -> Self {
67 WriteError(value)
68 }
69}
70
71#[derive(Debug)]
73pub enum ReadError {
74 Grpc(Status),
76 InvalidResponse(String),
78}
79
80impl ReadError {
81 pub fn invalid_response(msg: impl Into<String>) -> Self {
82 ReadError::InvalidResponse(msg.into())
83 }
84}
85
86impl Display for ReadError {
87 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
88 match self {
89 ReadError::Grpc(status) => write!(
90 f,
91 "read tuples grpc call: {:?}: {}",
92 status.code(),
93 status.message()
94 ),
95 ReadError::InvalidResponse(msg) => write!(f, "invalid read response: {msg}"),
96 }
97 }
98}
99
100impl std::error::Error for ReadError {
101 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
102 match self {
103 ReadError::Grpc(status) => Some(status),
104 ReadError::InvalidResponse(_) => None,
105 }
106 }
107}
108
109impl From<Status> for ReadError {
110 fn from(value: Status) -> Self {
111 ReadError::Grpc(value)
112 }
113}