termwright_protocol/
error.rs1use std::fmt;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
10pub struct Violation {
11 pub code: &'static str,
13 pub detail: String,
15}
16
17impl Violation {
18 pub(crate) fn new(code: &'static str, detail: impl Into<String>) -> Self {
19 Self {
20 code,
21 detail: detail.into(),
22 }
23 }
24}
25
26impl fmt::Display for Violation {
27 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
28 write!(formatter, "{}: {}", self.code, self.detail)
29 }
30}
31
32impl std::error::Error for Violation {}
33
34#[derive(Debug, Clone, PartialEq, Eq)]
40pub struct ValidationError {
41 pub code: &'static str,
43 pub detail: String,
45}
46
47impl ValidationError {
48 pub(crate) fn new(code: &'static str, detail: impl Into<String>) -> Self {
49 Self {
50 code,
51 detail: detail.into(),
52 }
53 }
54}
55
56impl fmt::Display for ValidationError {
57 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
58 write!(formatter, "{}: {}", self.code, self.detail)
59 }
60}
61
62impl std::error::Error for ValidationError {}
63
64#[derive(Debug, Clone, PartialEq, Eq)]
67pub struct ParseError {
68 pub code: &'static str,
70 pub detail: String,
72}
73
74impl ParseError {
75 pub(crate) fn new(code: &'static str, detail: impl Into<String>) -> Self {
76 Self {
77 code,
78 detail: detail.into(),
79 }
80 }
81
82 pub(crate) fn malformed(detail: impl Into<String>) -> Self {
83 Self::new("malformed", detail)
84 }
85}
86
87impl fmt::Display for ParseError {
88 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
89 write!(formatter, "{}: {}", self.code, self.detail)
90 }
91}
92
93impl std::error::Error for ParseError {}
94
95#[derive(Debug)]
97pub enum Error {
98 Protocol(Violation),
100 Validation(ValidationError),
102 Parse(ParseError),
104 Io(std::io::Error),
106 HandshakeTimeout,
108 WriteTimeout,
115}
116
117impl fmt::Display for Error {
118 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
119 match self {
120 Error::Protocol(inner) => write!(formatter, "{inner}"),
121 Error::Validation(inner) => write!(formatter, "{inner}"),
122 Error::Parse(inner) => write!(formatter, "{inner}"),
123 Error::Io(inner) => write!(formatter, "io: {inner}"),
124 Error::HandshakeTimeout => write!(formatter, "timed out waiting for hello-ack"),
125 Error::WriteTimeout => {
126 write!(
127 formatter,
128 "the driver did not read within the write deadline"
129 )
130 }
131 }
132 }
133}
134
135impl std::error::Error for Error {}
136
137impl From<Violation> for Error {
138 fn from(inner: Violation) -> Self {
139 Error::Protocol(inner)
140 }
141}
142
143impl From<ValidationError> for Error {
144 fn from(inner: ValidationError) -> Self {
145 Error::Validation(inner)
146 }
147}
148
149impl From<ParseError> for Error {
150 fn from(inner: ParseError) -> Self {
151 Error::Parse(inner)
152 }
153}
154
155impl From<std::io::Error> for Error {
156 fn from(inner: std::io::Error) -> Self {
157 Error::Io(inner)
158 }
159}