diff options
Diffstat (limited to 'third_party/rust/midir/src/errors.rs')
-rw-r--r-- | third_party/rust/midir/src/errors.rs | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/third_party/rust/midir/src/errors.rs b/third_party/rust/midir/src/errors.rs new file mode 100644 index 0000000000..69331528c9 --- /dev/null +++ b/third_party/rust/midir/src/errors.rs @@ -0,0 +1,114 @@ +use std::error::Error; +use std::fmt; + +const INVALID_PORT_MSG: &str = "invalid port"; +const PORT_OUT_OF_RANGE_MSG: &str = "provided port number was out of range"; +const CANNOT_RETRIEVE_PORT_NAME_MSG: &str = "unknown error when trying to retrieve the port name"; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +/// An error that can occur during initialization (i.e., while +/// creating a `MidiInput` or `MidiOutput` object). +pub struct InitError; + +impl Error for InitError {} + +impl fmt::Display for InitError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + "MIDI support could not be initialized".fmt(f) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +/// An error that can occur when retrieving information about +/// available ports. +pub enum PortInfoError { + PortNumberOutOfRange, // TODO: don't expose this + InvalidPort, + CannotRetrievePortName, +} + +impl Error for PortInfoError {} + +impl fmt::Display for PortInfoError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + PortInfoError::PortNumberOutOfRange => PORT_OUT_OF_RANGE_MSG.fmt(f), + PortInfoError::InvalidPort => INVALID_PORT_MSG.fmt(f), + PortInfoError::CannotRetrievePortName => CANNOT_RETRIEVE_PORT_NAME_MSG.fmt(f), + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +/// The kind of error for a `ConnectError`. +pub enum ConnectErrorKind { + InvalidPort, + Other(&'static str) +} + +impl ConnectErrorKind {} + +impl fmt::Display for ConnectErrorKind { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + ConnectErrorKind::InvalidPort => INVALID_PORT_MSG.fmt(f), + ConnectErrorKind::Other(msg) => msg.fmt(f) + } + } +} + +/// An error that can occur when trying to connect to a port. +pub struct ConnectError<T> { + kind: ConnectErrorKind, + inner: T +} + +impl<T> ConnectError<T> { + pub fn new(kind: ConnectErrorKind, inner: T) -> ConnectError<T> { + ConnectError { kind: kind, inner: inner } + } + + /// Helper method to create ConnectErrorKind::Other. + pub fn other(msg: &'static str, inner: T) -> ConnectError<T> { + Self::new(ConnectErrorKind::Other(msg), inner) + } + + pub fn kind(&self) -> ConnectErrorKind { + self.kind + } + + pub fn into_inner(self) -> T { + self.inner + } +} + +impl<T> fmt::Debug for ConnectError<T> { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + self.kind.fmt(f) + } +} + +impl<T> fmt::Display for ConnectError<T> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.kind.fmt(f) + } +} + +impl<T> Error for ConnectError<T> {} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +/// An error that can occur when sending MIDI messages. +pub enum SendError { + InvalidData(&'static str), + Other(&'static str) +} + +impl Error for SendError {} + +impl fmt::Display for SendError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + SendError::InvalidData(msg) | SendError::Other(msg) => msg.fmt(f) + } + } +} |