use std::marker::PhantomData;
use crate::sys as ffi;
use crate::error::{Error, Result};
use crate::stream::StreamConfiguration;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConfigStatus {
Valid,
Adjusted,
Invalid,
}
pub struct CameraConfiguration {
pub(crate) ptr: *mut ffi::lc_camera_configuration_t,
}
unsafe impl Send for CameraConfiguration {}
impl CameraConfiguration {
pub(crate) fn from_raw(ptr: *mut ffi::lc_camera_configuration_t) -> Self {
Self { ptr }
}
pub fn validate(&mut self) -> Result<ConfigStatus> {
let status = unsafe { ffi::lc_camera_configuration_validate(self.ptr) };
match status {
ffi::lc_config_status_t_LC_CONFIG_STATUS_VALID => Ok(ConfigStatus::Valid),
ffi::lc_config_status_t_LC_CONFIG_STATUS_ADJUSTED => Ok(ConfigStatus::Adjusted),
_ => Err(Error::InvalidConfig),
}
}
pub fn size(&self) -> usize {
unsafe { ffi::lc_camera_configuration_size(self.ptr) }
}
pub fn at(&mut self, index: u32) -> Result<StreamConfiguration<'_>> {
let sc_ptr = unsafe { ffi::lc_camera_configuration_at(self.ptr, index) };
if sc_ptr.is_null() {
return Err(Error::IndexOutOfRange);
}
Ok(StreamConfiguration {
ptr: sc_ptr,
_phantom: PhantomData,
})
}
}
impl Drop for CameraConfiguration {
fn drop(&mut self) {
unsafe { ffi::lc_camera_configuration_destroy(self.ptr) };
}
}