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 { kind: ConnectErrorKind, inner: T } impl ConnectError { pub fn new(kind: ConnectErrorKind, inner: T) -> ConnectError { ConnectError { kind: kind, inner: inner } } /// Helper method to create ConnectErrorKind::Other. pub fn other(msg: &'static str, inner: T) -> ConnectError { Self::new(ConnectErrorKind::Other(msg), inner) } pub fn kind(&self) -> ConnectErrorKind { self.kind } pub fn into_inner(self) -> T { self.inner } } impl fmt::Debug for ConnectError { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { self.kind.fmt(f) } } impl fmt::Display for ConnectError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.kind.fmt(f) } } impl Error for ConnectError {} #[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) } } }