1use std::{ffi::NulError, string::FromUtf8Error, sync::PoisonError};
14
15use thiserror::Error;
16
17use crate::protocol::{CoapMessageType, CoapOptionType};
18
19#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
20pub enum EndpointCreationError {
21 #[error("CoAP endpoint creation error: unknown error in call to libcoap")]
23 Unknown,
24}
25
26#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
27pub enum ContextConfigurationError {
28 #[error("CoAP context configuration error: unknown error in call to libcoap")]
30 Unknown,
31 #[error(
32 "CoAP context configuration error: attempted to set encryption context while one has already been configured for this encryption variant"
33 )]
34 CryptoContextAlreadySet,
35}
36
37#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
38pub enum MessageCreationError {
39 #[error("CoAP message creation error: unknown error in call to libcoap")]
41 Unknown,
42}
43
44#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
45pub enum IoProcessError {
46 #[error("CoAP IO error: unknown error in call to libcoap")]
48 Unknown,
49}
50
51#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
52pub enum SessionGetAppDataError {
53 #[error("CoAP application data retrieval error: wrong type")]
55 WrongType,
56}
57
58#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
59pub enum OptionCreationError {
60 #[error("CoAP option creation error: unknown error in call to libcoap")]
62 Unknown,
63}
64
65#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
66pub enum SessionCreationError {
67 #[error("CoAP session creation error: unknown error in call to libcoap")]
69 Unknown,
70}
71
72#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
73pub enum UnknownOptionError {
74 #[error("CoAP option conversion error: unknown option")]
76 Unknown,
77}
78
79#[derive(Error, Debug)]
80pub enum RngError {
81 #[error("CoAP RNG error: unknown error in call to libcoap")]
83 Unknown,
84 #[error("CoAP RNG configuration error: global RNG mutex is poisoned")]
86 GlobalMutexPoisonError,
87}
88
89impl<T> From<PoisonError<T>> for RngError {
90 fn from(_value: PoisonError<T>) -> Self {
91 RngError::GlobalMutexPoisonError
92 }
93}
94
95#[derive(Error, Debug, Clone, Eq, PartialEq)]
96pub enum OptionValueError {
97 #[error("CoAP option has invalid value: too short")]
99 TooShort,
100 #[error("CoAP option has invalid value: too long")]
102 TooLong,
103 #[error("CoAP option has invalid value: invalid string")]
105 StringConversion(#[from] FromUtf8Error),
106 #[error("CoAP option has invalid value: invalid URI")]
108 UriParsing(#[from] UriParsingError),
109 #[error("CoAP option has invalid value")]
111 IllegalValue,
112}
113
114#[derive(Error, Debug, Clone, Eq, PartialEq)]
115pub enum UriParsingError {
116 #[error("CoAP option creation error: unknown error in call to libcoap")]
118 Unknown,
119 #[error("URI scheme {} is not a valid CoAP scheme known to libcoap", .0)]
121 NotACoapScheme(String),
122 #[error("Provided URI contains a null byte")]
124 ContainsNullByte(#[from] NulError),
125}
126
127#[derive(Error, Debug, Clone, Eq, PartialEq)]
128pub enum MessageConversionError {
129 #[error("CoAP message conversion error: invalid option value for {:?}", .0)]
131 InvalidOptionValue(Option<CoapOptionType>, #[source] OptionValueError),
132 #[error("CoAP message conversion error: option of type {:?} invalid for message type", .0)]
135 InvalidOptionForMessageType(CoapOptionType),
136 #[error("CoAP message conversion error: non-repeatable option of type {:?} repeated", .0)]
138 NonRepeatableOptionRepeated(CoapOptionType),
139 #[error("CoAP message conversion error: provided uri does not have scheme valid for CoAP")]
141 NotACoapUri(UriParsingError),
142 #[error("CoAP message conversion error: invalid message code")]
144 InvalidMessageCode(#[from] MessageCodeError),
145 #[error("CoAP message conversion error: empty message contains data")]
147 DataInEmptyMessage,
148 #[error("CoAP message conversion error: token missing")]
150 MissingToken,
151 #[error("CoAP message conversion error: message id missing")]
153 MissingMessageId,
154 #[error("CoAP message conversion error: options {:?} and {:?} cannot be combined", .0, .1)]
157 InvalidOptionCombination(CoapOptionType, CoapOptionType),
158 #[error("CoAP option identified as critical but not recognized")]
161 CriticalOptionUnrecognized,
162 #[error("unknown CoAP message conversion error")]
164 Unknown,
165}
166
167impl From<UriParsingError> for MessageConversionError {
168 fn from(v: UriParsingError) -> Self {
169 MessageConversionError::NotACoapUri(v)
170 }
171}
172
173#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
174pub enum MessageCodeError {
175 #[error("CoAP message code conversion error: not a request code")]
177 NotARequestCode,
178 #[error("CoAP message code conversion error: not a response code")]
180 NotAResponseCode,
181}
182
183#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
184pub enum MessageTypeError {
185 #[error("message type {:?} cannot be used for this message code", .0)]
187 InvalidForMessageCode(CoapMessageType),
188}