rosc/
errors.rs

1use alloc::{
2    fmt,
3    string::{self, String},
4};
5use nom::error::{ErrorKind, FromExternalError, ParseError};
6#[cfg(feature = "std")]
7use std::error;
8
9/// Represents errors returned by `decode` or `encode`.
10#[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}