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 PublicationQueueFull,
118 PublicationWorkerFailed,
121}
122
123impl fmt::Display for Error {
124 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
125 match self {
126 Error::Protocol(inner) => write!(formatter, "{inner}"),
127 Error::Validation(inner) => write!(formatter, "{inner}"),
128 Error::Parse(inner) => write!(formatter, "{inner}"),
129 Error::Io(inner) => write!(formatter, "io: {inner}"),
130 Error::HandshakeTimeout => write!(formatter, "timed out waiting for hello-ack"),
131 Error::WriteTimeout => {
132 write!(
133 formatter,
134 "the driver did not read within the write deadline"
135 )
136 }
137 Error::PublicationQueueFull => write!(formatter, "semantic publication queue full"),
138 Error::PublicationWorkerFailed => {
139 write!(formatter, "semantic publication worker failed")
140 }
141 }
142 }
143}
144
145impl std::error::Error for Error {}
146
147impl From<Violation> for Error {
148 fn from(inner: Violation) -> Self {
149 Error::Protocol(inner)
150 }
151}
152
153impl From<ValidationError> for Error {
154 fn from(inner: ValidationError) -> Self {
155 Error::Validation(inner)
156 }
157}
158
159impl From<ParseError> for Error {
160 fn from(inner: ParseError) -> Self {
161 Error::Parse(inner)
162 }
163}
164
165impl From<std::io::Error> for Error {
166 fn from(inner: std::io::Error) -> Self {
167 Error::Io(inner)
168 }
169}