1use alloc::{
2 fmt,
3 string::{self, String},
4};
5use nom::error::{ErrorKind, FromExternalError, ParseError};
6#[cfg(feature = "std")]
7use std::error;
8
9#[derive(Debug)]
11pub enum OscError {
12 StringError(string::FromUtf8Error),
13 ReadError(ErrorKind),
14 BadChar(char),
15 BadPacket(&'static str),
16 BadMessage(&'static str),
17 BadString(&'static str),
18 BadArg(String),
19 BadBundle(String),
20 BadAddressPattern(String),
21 BadAddress(String),
22 RegexError(String),
23 Unimplemented,
24}
25
26impl fmt::Display for OscError {
27 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
28 match self {
29 OscError::StringError(err) => write!(f, "reading OSC string as utf-8: {}", err),
30 OscError::ReadError(kind) => write!(f, "error reading from buffer: {:?}", kind),
31 OscError::BadChar(char) => write!(f, "parser error at char: {:?}", char),
32 OscError::BadPacket(msg) => write!(f, "bad OSC packet: {}", msg),
33 OscError::BadMessage(msg) => write!(f, "bad OSC message: {}", msg),
34 OscError::BadString(msg) => write!(f, "bad OSC string: {}", msg),
35 OscError::BadArg(msg) => write!(f, "bad OSC argument: {}", msg),
36 OscError::BadBundle(msg) => write!(f, "bad OSC bundle: {}", msg),
37 OscError::BadAddressPattern(msg) => write!(f, "bad OSC address pattern: {}", msg),
38 OscError::BadAddress(msg) => write!(f, "bad OSC address: {}", msg),
39 OscError::RegexError(msg) => write!(f, "OSC address pattern regex error: {}", msg),
40 OscError::Unimplemented => write!(f, "unimplemented"),
41 }
42 }
43}
44
45impl<I> ParseError<I> for OscError {
46 fn from_error_kind(_input: I, kind: ErrorKind) -> Self {
47 Self::ReadError(kind)
48 }
49 fn append(_input: I, _kind: ErrorKind, other: Self) -> Self {
50 other
51 }
52
53 fn from_char(_input: I, c: char) -> Self {
54 Self::BadChar(c)
55 }
56
57 fn or(self, _other: Self) -> Self {
58 self
59 }
60}
61
62impl<I> FromExternalError<I, OscError> for OscError {
63 fn from_external_error(_input: I, _kind: ErrorKind, e: OscError) -> Self {
64 e
65 }
66}
67
68#[cfg(feature = "std")]
69impl error::Error for OscError {
70 fn source(&self) -> Option<&(dyn error::Error + 'static)> {
71 match self {
72 OscError::StringError(err) => Some(err),
73 _ => None,
74 }
75 }
76}