1use std::string::FromUtf8Error;
13
14use thiserror::Error;
15
16use crate::protocol::{CoapMessageType, CoapOptionType};
17
18#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
19pub enum EndpointCreationError {
20 #[error("CoAP endpoint creation error: unknown error in call to libcoap")]
22 Unknown,
23}
24
25#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
26pub enum ContextCreationError {
27 #[error("CoAP context creation error: unknown error in call to libcoap")]
29 Unknown,
30}
31
32#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
33pub enum MessageCreationError {
34 #[error("CoAP message creation error: unknown error in call to libcoap")]
36 Unknown,
37}
38
39#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
40pub enum IoProcessError {
41 #[error("CoAP IO error: unknown error in call to libcoap")]
43 Unknown,
44}
45
46#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
47pub enum SessionGetAppDataError {
48 #[error("CoAP application data retrieval error: wrong type")]
50 WrongType,
51}
52
53#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
54pub enum OptionCreationError {
55 #[error("CoAP option creation error: unknown error in call to libcoap")]
57 Unknown,
58}
59
60#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
61pub enum SessionCreationError {
62 #[error("CoAP session creation error: unknown error in call to libcoap")]
64 Unknown,
65}
66
67#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
68pub enum UnknownOptionError {
69 #[error("CoAP option conversion error: unknown option")]
71 Unknown,
72}
73
74#[derive(Error, Debug, Clone, Eq, PartialEq)]
75pub enum OptionValueError {
76 #[error("CoAP option has invalid value: too short")]
78 TooShort,
79 #[error("CoAP option has invalid value: too long")]
81 TooLong,
82 #[error("CoAP option has invalid value: invalid string")]
84 StringConversion(#[from] FromUtf8Error),
85 #[error("CoAP option has invalid value")]
87 IllegalValue,
88}
89
90#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
91pub enum UriParsingError {
92 #[error("URL does not have scheme valid for libcoap")]
94 NotACoapScheme,
95}
96
97#[derive(Error, Debug, Clone, Eq, PartialEq)]
98pub enum MessageConversionError {
99 #[error("CoAP message conversion error: invalid option value for {:?}", .0)]
101 InvalidOptionValue(Option<CoapOptionType>, #[source] OptionValueError),
102 #[error("CoAP message conversion error: option of type {:?} invalid for message type", .0)]
105 InvalidOptionForMessageType(CoapOptionType),
106 #[error("CoAP message conversion error: non-repeatable option of type {:?} repeated", .0)]
108 NonRepeatableOptionRepeated(CoapOptionType),
109 #[error("CoAP message conversion error: provided uri does not have scheme valid for CoAP")]
111 NotACoapUri(UriParsingError),
112 #[error("CoAP message conversion error: invalid uri (malformed proxy URL?)")]
114 InvalidUri(url::ParseError),
115 #[error("CoAP message conversion error: invalid message code")]
117 InvalidMessageCode(#[from] MessageCodeError),
118 #[error("CoAP message conversion error: empty message contains data")]
120 DataInEmptyMessage,
121 #[error("CoAP message conversion error: token missing")]
123 MissingToken,
124 #[error("CoAP message conversion error: message id missing")]
126 MissingMessageId,
127 #[error("CoAP message conversion error: options {:?} and {:?} cannot be combined", .0, .1)]
130 InvalidOptionCombination(CoapOptionType, CoapOptionType),
131 #[error("CoAP option identified as critical but not recognized")]
134 CriticalOptionUnrecognized,
135 #[error("unknown CoAP message conversion error")]
137 Unknown,
138}
139
140impl From<UriParsingError> for MessageConversionError {
141 fn from(v: UriParsingError) -> Self {
142 MessageConversionError::NotACoapUri(v)
143 }
144}
145
146impl From<url::ParseError> for MessageConversionError {
147 fn from(v: url::ParseError) -> Self {
148 MessageConversionError::InvalidUri(v)
149 }
150}
151
152#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
153pub enum MessageCodeError {
154 #[error("CoAP message code conversion error: not a request code")]
156 NotARequestCode,
157 #[error("CoAP message code conversion error: not a response code")]
159 NotAResponseCode,
160}
161
162#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
163pub enum MessageTypeError {
164 #[error("message type {:?} cannot be used for this message code", .0)]
166 InvalidForMessageCode(CoapMessageType),
167}