Skip to main content

nio_client/
error.rs

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/// Errors from Read / Expand / Watch / list-namespaces and response decoding.
72#[derive(Debug)]
73pub enum ReadError {
74    /// gRPC transport or server status.
75    Grpc(Status),
76    /// Server returned a protobuf we cannot map (e.g. missing `Tuple.user`).
77    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}