aboutsummaryrefslogtreecommitdiff
path: root/hid/src/error.rs
blob: 367f47f5d986ea0858f0e4174f0138ce6523d768 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use std::ffi::CStr;
use libc::c_int;
use sys::*;
use std::{error, fmt};

#[derive(Clone, PartialEq, Eq, Debug)]
pub enum Error {
	Initialized,
	NotFound,
	General,
	Write,
	Read,
	String(String),
}

pub type Result<T> = ::std::result::Result<T, Error>;

impl From<c_int> for Error {
	fn from(value: c_int) -> Error {
		match value {
			_ => Error::General
		}
	}
}

impl From<*mut hid_device> for Error {
	fn from(value: *mut hid_device) -> Error {
		unsafe {
			Error::String(CStr::from_ptr(hid_error(value) as *const _).to_str().unwrap().to_owned())
		}
	}
}

impl fmt::Display for Error {
	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
		f.write_str(error::Error::description(self))
	}
}

impl error::Error for Error {
	fn description(&self) -> &str {
		match *self {
			Error::Initialized =>
				"Already initialized.",

			Error::NotFound =>
				"Device not found.",

			Error::General =>
				"General error.",

			Error::Write =>
				"Write error.",

			Error::Read =>
				"Read error.",

			Error::String(ref err) =>
				err,
		}
	}
}