blob: 3081016469675b1b36bcd783d52035012214751d [file] [log] [blame]
//! This module is deprecated and types are exported from the top-level of the crate
//!
//! In futures versions of the crate, this module will no longer be included in the crate.
use crate::IoctlKind;
use std::error::Error as StdError;
use std::fmt;
use std::io::Error as IOError;
pub(crate) type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub struct Error {
kind: ErrorKind,
}
#[derive(Debug)]
pub enum ErrorKind {
Event(nix::Error),
Io(IOError),
Ioctl { kind: IoctlKind, cause: nix::Error },
InvalidRequest(usize, usize),
Offset(u32),
}
pub(crate) fn ioctl_err(kind: IoctlKind, cause: nix::Error) -> Error {
Error {
kind: ErrorKind::Ioctl { kind, cause },
}
}
pub(crate) fn invalid_err(n_lines: usize, n_values: usize) -> Error {
Error {
kind: ErrorKind::InvalidRequest(n_lines, n_values),
}
}
pub(crate) fn offset_err(offset: u32) -> Error {
Error {
kind: ErrorKind::Offset(offset),
}
}
pub(crate) fn event_err(err: nix::Error) -> Error {
Error {
kind: ErrorKind::Event(err),
}
}
impl fmt::Display for IoctlKind {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
IoctlKind::ChipInfo => write!(f, "get chip info"),
IoctlKind::LineInfo => write!(f, "get line info"),
IoctlKind::LineHandle => write!(f, "get line handle"),
IoctlKind::LineEvent => write!(f, "get line event "),
IoctlKind::GetLine => write!(f, "get line value"),
IoctlKind::SetLine => write!(f, "set line value"),
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match &self.kind {
ErrorKind::Event(err) => write!(f, "Failed to read event: {}", err),
ErrorKind::Io(err) => err.fmt(f),
ErrorKind::Ioctl { cause, kind } => write!(f, "Ioctl to {} failed: {}", kind, cause),
ErrorKind::InvalidRequest(n_lines, n_values) => write!(
f,
"Invalid request: {} values requested to be set but only {} lines are open",
n_values, n_lines
),
ErrorKind::Offset(offset) => write!(f, "Offset {} is out of range", offset),
}
}
}
impl StdError for Error {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
match &self.kind {
ErrorKind::Event(err) => Some(err),
ErrorKind::Io(err) => Some(err),
ErrorKind::Ioctl { kind: _, cause } => Some(cause),
_ => None,
}
}
}
impl From<IOError> for Error {
fn from(err: IOError) -> Self {
Self {
kind: ErrorKind::Io(err),
}
}
}