extern crate libsoundio_sys as raw;
use std::error;
use std::ffi::CStr;
use std::fmt;
use std::result;
use std::os::raw::c_int;
#[derive(Debug, Copy, Clone)]
pub enum Error {
NoMem,
InitAudioBackend,
SystemResources,
OpeningDevice,
NoSuchDevice,
Invalid,
BackendUnavailable,
Streaming,
IncompatibleDevice,
NoSuchClient,
IncompatibleBackend,
BackendDisconnected,
Interrupted,
Underflow,
EncodingString,
Unknown,
}
impl From<c_int> for Error {
fn from(err: c_int) -> Error {
match err {
1 => Error::NoMem,
2 => Error::InitAudioBackend,
3 => Error::SystemResources,
4 => Error::OpeningDevice,
5 => Error::NoSuchDevice,
6 => Error::Invalid,
7 => Error::BackendUnavailable,
8 => Error::Streaming,
9 => Error::IncompatibleDevice,
10 => Error::NoSuchClient,
11 => Error::IncompatibleBackend,
12 => Error::BackendDisconnected,
13 => Error::Interrupted,
14 => Error::Underflow,
15 => Error::EncodingString,
_ => Error::Unknown,
}
}
}
impl From<Error> for c_int {
fn from(err: Error) -> c_int {
match err {
Error::NoMem => 1,
Error::InitAudioBackend => 2,
Error::SystemResources => 3,
Error::OpeningDevice => 4,
Error::NoSuchDevice => 5,
Error::Invalid => 6,
Error::BackendUnavailable => 7,
Error::Streaming => 8,
Error::IncompatibleDevice => 9,
Error::NoSuchClient => 10,
Error::IncompatibleBackend => 11,
Error::BackendDisconnected => 12,
Error::Interrupted => 13,
Error::Underflow => 14,
Error::EncodingString => 15,
Error::Unknown => -1, }
}
}
pub type Result<T> = result::Result<T, Error>;
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use std::error::Error;
f.write_str(self.description())
}
}
impl error::Error for Error {
fn description(&self) -> &str {
let c_str: &CStr = unsafe { CStr::from_ptr(raw::soundio_strerror((*self).into())) };
c_str.to_str().unwrap()
}
fn cause(&self) -> Option<&dyn error::Error> {
None
}
}
impl From<Error> for String {
fn from(err: Error) -> String {
use std::error::Error;
err.description().to_string()
}
}