use thiserror::Error;
#[derive(Debug, Error)]
pub enum CcapError {
#[error("No error")]
None,
#[error("No camera device found")]
NoDeviceFound,
#[error("Invalid device: {0}")]
InvalidDevice(String),
#[error("Camera device open failed")]
DeviceOpenFailed,
#[error("Device already opened")]
DeviceAlreadyOpened,
#[error("Device not opened")]
DeviceNotOpened,
#[error("Capture start failed")]
CaptureStartFailed,
#[error("Capture stop failed")]
CaptureStopFailed,
#[error("Frame grab failed")]
FrameGrabFailed,
#[error("Timeout occurred")]
Timeout,
#[error("Invalid parameter: {0}")]
InvalidParameter(String),
#[error("Operation not supported")]
NotSupported,
#[error("Backend set failed")]
BackendSetFailed,
#[error("String conversion error: {0}")]
StringConversionError(String),
#[error("File operation failed: {0}")]
FileOperationFailed(String),
#[error("Device not found")]
DeviceNotFound,
#[error("Internal error: {0}")]
InternalError(String),
#[error("Unknown error: {code}")]
Unknown {
code: i32,
},
}
impl From<i32> for CcapError {
fn from(code: i32) -> Self {
use crate::sys::*;
let code_u = code as CcapErrorCode;
#[allow(non_upper_case_globals)]
match code_u {
CcapErrorCode_CCAP_ERROR_NONE => CcapError::None,
CcapErrorCode_CCAP_ERROR_NO_DEVICE_FOUND => CcapError::NoDeviceFound,
CcapErrorCode_CCAP_ERROR_INVALID_DEVICE => CcapError::InvalidDevice("".to_string()),
CcapErrorCode_CCAP_ERROR_DEVICE_OPEN_FAILED => CcapError::DeviceOpenFailed,
CcapErrorCode_CCAP_ERROR_DEVICE_START_FAILED => CcapError::CaptureStartFailed,
CcapErrorCode_CCAP_ERROR_DEVICE_STOP_FAILED => CcapError::CaptureStopFailed,
CcapErrorCode_CCAP_ERROR_FRAME_CAPTURE_FAILED => CcapError::FrameGrabFailed,
CcapErrorCode_CCAP_ERROR_FRAME_CAPTURE_TIMEOUT => CcapError::Timeout,
CcapErrorCode_CCAP_ERROR_UNSUPPORTED_PIXEL_FORMAT => CcapError::NotSupported,
CcapErrorCode_CCAP_ERROR_UNSUPPORTED_RESOLUTION => CcapError::NotSupported,
CcapErrorCode_CCAP_ERROR_PROPERTY_SET_FAILED => {
CcapError::InvalidParameter("".to_string())
}
CcapErrorCode_CCAP_ERROR_MEMORY_ALLOCATION_FAILED => CcapError::Unknown { code },
CcapErrorCode_CCAP_ERROR_INTERNAL_ERROR => CcapError::Unknown { code },
_ => CcapError::Unknown { code },
}
}
}
pub type Result<T> = std::result::Result<T, CcapError>;