cat_dev/mion/
errors.rs

1//! Error types specifically for interacting with MION CGI's/protos.
2
3use crate::{
4	errors::{APIError, CatBridgeError, NetworkError, NetworkParseError},
5	mion::{
6		cgis::MIONCGIApiError,
7		firmware::MIONFirmwareAPIError,
8		proto::{
9			cgis::MIONCGIErrors,
10			control::MIONControlProtocolError,
11			parameter::{MIONParamProtocolError, MIONParameterAPIError},
12		},
13	},
14};
15use miette::Diagnostic;
16use thiserror::Error;
17
18/// Errors that come from MION APIs specifically.
19#[derive(Error, Diagnostic, Debug, PartialEq, Eq)]
20pub enum MIONAPIError {
21	#[error(transparent)]
22	#[diagnostic(transparent)]
23	CGI(#[from] MIONCGIApiError),
24	/// You attempted to set the default host bridge to a bridge that does not exist.
25	#[error("You cannot set a default bridge that does not exist.")]
26	#[diagnostic(code(cat_dev::api::mion::default_device_must_exist))]
27	DefaultDeviceMustExist,
28	/// You attempted to create a MION device name, but it was empty.
29	///
30	/// MION Identities must have at LEAST 1 byte.
31	#[error("The device name cannot be empty, it must be at least one byte long.")]
32	#[diagnostic(code(cat_dev::api::mion::device_name_cannot_be_empty))]
33	DeviceNameCannotBeEmpty,
34	/// You attempted to create a MION device name, which did not contain ASCII
35	/// characters.
36	///
37	/// MION Identities must contain all ascii characters.
38	#[error("A device name has to be completely ASCII! But it wasn't ASCII!")]
39	#[diagnostic(code(cat_dev::api::mion::device_name_not_ascii))]
40	DeviceNameMustBeAscii,
41	/// You attempted to create a MION device name, but it was longer than 255
42	/// bytes.
43	///
44	/// A MION device name has to be serialized into a packet, where it's length
45	/// is represented as a [`u8`] which means it can only be [`u8::MAX`], aka
46	/// 255 bytes.
47	#[error("A Device Name can only be 255 bytes long, but you specified one: {0} bytes long.")]
48	#[diagnostic(code(cat_dev::api::mion::device_name_too_long))]
49	DeviceNameTooLong(usize),
50	/// An error occured handling firmware.
51	#[error(transparent)]
52	#[diagnostic(transparent)]
53	Firmware(#[from] MIONFirmwareAPIError),
54	/// An error dealing with the MION Parameter Space API.
55	#[error(transparent)]
56	#[diagnostic(transparent)]
57	ParameterSpace(#[from] MIONParameterAPIError),
58}
59
60impl From<MIONCGIApiError> for APIError {
61	fn from(value: MIONCGIApiError) -> Self {
62		Self::MION(value.into())
63	}
64}
65impl From<MIONCGIApiError> for CatBridgeError {
66	fn from(value: MIONCGIApiError) -> Self {
67		Self::API(value.into())
68	}
69}
70
71impl From<MIONFirmwareAPIError> for APIError {
72	fn from(value: MIONFirmwareAPIError) -> Self {
73		Self::MION(value.into())
74	}
75}
76impl From<MIONFirmwareAPIError> for CatBridgeError {
77	fn from(value: MIONFirmwareAPIError) -> Self {
78		Self::API(value.into())
79	}
80}
81
82impl From<MIONParameterAPIError> for APIError {
83	fn from(value: MIONParameterAPIError) -> Self {
84		Self::MION(value.into())
85	}
86}
87impl From<MIONParameterAPIError> for CatBridgeError {
88	fn from(value: MIONParameterAPIError) -> Self {
89		Self::API(value.into())
90	}
91}
92
93/// Errors dealing with various MION Protocols.
94#[derive(Error, Diagnostic, Debug, PartialEq, Eq)]
95pub enum MIONProtocolError {
96	/// Errors related to CGI, and HTML pages.
97	#[error(transparent)]
98	#[diagnostic(transparent)]
99	CGI(#[from] MIONCGIErrors),
100	/// Errors related to the CONTROL protocol for MION.
101	#[error(transparent)]
102	#[diagnostic(transparent)]
103	Control(#[from] MIONControlProtocolError),
104	/// Errors related to the PARAMETER SPACE protocol for MION.
105	#[error(transparent)]
106	#[diagnostic(transparent)]
107	Params(#[from] MIONParamProtocolError),
108}
109
110impl From<MIONProtocolError> for NetworkError {
111	fn from(value: MIONProtocolError) -> Self {
112		Self::Parse(value.into())
113	}
114}
115impl From<MIONProtocolError> for CatBridgeError {
116	fn from(value: MIONProtocolError) -> Self {
117		Self::Network(value.into())
118	}
119}
120
121impl From<MIONCGIErrors> for NetworkParseError {
122	fn from(value: MIONCGIErrors) -> Self {
123		Self::MION(value.into())
124	}
125}
126impl From<MIONCGIErrors> for NetworkError {
127	fn from(value: MIONCGIErrors) -> Self {
128		Self::Parse(value.into())
129	}
130}
131impl From<MIONCGIErrors> for CatBridgeError {
132	fn from(value: MIONCGIErrors) -> Self {
133		Self::Network(value.into())
134	}
135}
136
137impl From<MIONParamProtocolError> for NetworkParseError {
138	fn from(value: MIONParamProtocolError) -> Self {
139		Self::MION(value.into())
140	}
141}
142impl From<MIONParamProtocolError> for NetworkError {
143	fn from(value: MIONParamProtocolError) -> Self {
144		Self::Parse(value.into())
145	}
146}
147impl From<MIONParamProtocolError> for CatBridgeError {
148	fn from(value: MIONParamProtocolError) -> Self {
149		Self::Network(value.into())
150	}
151}
152
153impl From<MIONControlProtocolError> for NetworkParseError {
154	fn from(value: MIONControlProtocolError) -> Self {
155		Self::MION(value.into())
156	}
157}
158impl From<MIONControlProtocolError> for NetworkError {
159	fn from(value: MIONControlProtocolError) -> Self {
160		Self::Parse(value.into())
161	}
162}
163impl From<MIONControlProtocolError> for CatBridgeError {
164	fn from(value: MIONControlProtocolError) -> Self {
165		Self::Network(value.into())
166	}
167}