use std::ffi::NulError;
use std::str::Utf8Error;
use thiserror::Error;
#[non_exhaustive]
#[derive(Error, Debug)]
pub enum CpdbError {
#[error("Null pointer encountered")]
NullPointer,
#[error("Invalid printer object")]
InvalidPrinter,
#[error("Not found: {0}")]
NotFound(String),
#[error("Printer error: {0}")]
PrinterError(String),
#[error("Print job failed: {0}")]
JobFailed(String),
#[error("Backend error: {0}")]
BackendError(String),
#[error("Frontend error: {0}")]
FrontendError(String),
#[error("Option error: {0}")]
OptionError(String),
#[error("Invalid UTF-8 string: {0}")]
Utf8Error(#[from] Utf8Error),
#[error("Nul byte in string: {0}")]
NulError(#[from] NulError),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
#[error("Invalid status code: {0}")]
InvalidStatus(i32),
#[error("Unsupported operation")]
Unsupported,
#[error("D-Bus error: {0}")]
DbusError(String),
#[error("D-Bus FDO error: {0}")]
FdoError(String),
}
#[cfg(feature = "zbus-backend")]
impl From<zbus::Error> for CpdbError {
fn from(e: zbus::Error) -> Self {
Self::DbusError(e.to_string())
}
}
#[cfg(feature = "zbus-backend")]
impl From<zbus::fdo::Error> for CpdbError {
fn from(e: zbus::fdo::Error) -> Self {
Self::FdoError(e.to_string())
}
}
pub type Result<T> = std::result::Result<T, CpdbError>;
#[cfg(feature = "ffi")]
impl From<cpdb_sys::error::CpdbError> for CpdbError {
fn from(e: cpdb_sys::error::CpdbError) -> Self {
match e {
cpdb_sys::error::CpdbError::NullPointer => Self::NullPointer,
cpdb_sys::error::CpdbError::InvalidPrinter => Self::InvalidPrinter,
cpdb_sys::error::CpdbError::NotFound(s) => Self::NotFound(s),
cpdb_sys::error::CpdbError::PrinterError(s) => Self::PrinterError(s),
cpdb_sys::error::CpdbError::JobFailed(s) => Self::JobFailed(s),
cpdb_sys::error::CpdbError::BackendError(s) => Self::BackendError(s),
cpdb_sys::error::CpdbError::FrontendError(s) => Self::FrontendError(s),
cpdb_sys::error::CpdbError::OptionError(s) => Self::OptionError(s),
cpdb_sys::error::CpdbError::Utf8Error(e) => Self::Utf8Error(e),
cpdb_sys::error::CpdbError::NulError(e) => Self::NulError(e),
cpdb_sys::error::CpdbError::IoError(e) => Self::IoError(e),
cpdb_sys::error::CpdbError::InvalidStatus(c) => Self::InvalidStatus(c),
cpdb_sys::error::CpdbError::Unsupported => Self::Unsupported,
_ => Self::FrontendError(format!("cpdb-sys error: {e}")),
}
}
}