use std::{borrow::Cow, os::raw::c_int};
use crate::helper::chars_to_cow;
macro_rules! storage_has_ability {
($inf:expr, $it:ident) => {
$inf.fields as c_int & libgphoto2_sys::CameraStorageInfoFields::$it as c_int != 0
};
}
#[derive(Debug, Hash, PartialEq, Eq)]
pub enum StorageType {
Unknown,
FixedRom,
RemovableRom,
FixedRam,
RemovableRam,
}
#[derive(Debug, Hash, PartialEq, Eq)]
pub enum FilesystemType {
Unknown,
Flat,
Tree,
Dcf,
}
#[derive(Debug, Hash, PartialEq, Eq)]
pub enum AccessType {
Rw,
Ro,
RoDelete,
}
pub struct StorageInfo {
pub(crate) inner: libgphoto2_sys::CameraStorageInformation,
}
impl From<libgphoto2_sys::CameraStorageType> for StorageType {
fn from(storage_type: libgphoto2_sys::CameraStorageType) -> Self {
use libgphoto2_sys::CameraStorageType;
match storage_type {
CameraStorageType::GP_STORAGEINFO_ST_UNKNOWN => Self::Unknown,
CameraStorageType::GP_STORAGEINFO_ST_FIXED_ROM => Self::FixedRom,
CameraStorageType::GP_STORAGEINFO_ST_REMOVABLE_ROM => Self::RemovableRom,
CameraStorageType::GP_STORAGEINFO_ST_FIXED_RAM => Self::FixedRam,
CameraStorageType::GP_STORAGEINFO_ST_REMOVABLE_RAM => Self::RemovableRam,
}
}
}
impl From<libgphoto2_sys::CameraStorageFilesystemType> for FilesystemType {
fn from(fs_type: libgphoto2_sys::CameraStorageFilesystemType) -> Self {
use libgphoto2_sys::CameraStorageFilesystemType as GPFsType;
match fs_type {
GPFsType::GP_STORAGEINFO_FST_UNDEFINED => Self::Unknown,
GPFsType::GP_STORAGEINFO_FST_GENERICFLAT => Self::Flat,
GPFsType::GP_STORAGEINFO_FST_GENERICHIERARCHICAL => Self::Tree,
GPFsType::GP_STORAGEINFO_FST_DCF => Self::Dcf,
}
}
}
impl From<libgphoto2_sys::CameraStorageAccessType> for AccessType {
fn from(access_type: libgphoto2_sys::CameraStorageAccessType) -> Self {
use libgphoto2_sys::CameraStorageAccessType as GPAccessType;
match access_type {
GPAccessType::GP_STORAGEINFO_AC_READWRITE => Self::Rw,
GPAccessType::GP_STORAGEINFO_AC_READONLY => Self::Ro,
GPAccessType::GP_STORAGEINFO_AC_READONLY_WITH_DELETE => Self::RoDelete,
}
}
}
impl StorageInfo {
pub(crate) fn new(info: libgphoto2_sys::CameraStorageInformation) -> Self {
Self { inner: info }
}
pub fn base_directory(&self) -> Option<Cow<str>> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_BASE) {
Some(chars_to_cow(self.inner.basedir.as_ptr()))
} else {
None
}
}
pub fn label(&self) -> Option<Cow<str>> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_LABEL) {
Some(chars_to_cow(self.inner.label.as_ptr()))
} else {
None
}
}
pub fn description(&self) -> Option<Cow<str>> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_DESCRIPTION) {
Some(chars_to_cow(self.inner.description.as_ptr()))
} else {
None
}
}
pub fn storage_type(&self) -> Option<StorageType> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_STORAGETYPE) {
Some(self.inner.type_.into())
} else {
None
}
}
pub fn filesystem_type(&self) -> Option<FilesystemType> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_FILESYSTEMTYPE) {
Some(self.inner.fstype.into())
} else {
None
}
}
pub fn access_type(&self) -> Option<AccessType> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_ACCESS) {
Some(self.inner.access.into())
} else {
None
}
}
pub fn capacity(&self) -> Option<usize> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_MAXCAPACITY) {
Some(self.inner.capacitykbytes as usize)
} else {
None
}
}
pub fn free(&self) -> Option<usize> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_FREESPACEKBYTES) {
Some(self.inner.freekbytes as usize)
} else {
None
}
}
pub fn free_images(&self) -> Option<usize> {
if storage_has_ability!(self.inner, GP_STORAGEINFO_FREESPACEIMAGES) {
Some(self.inner.freeimages as usize)
} else {
None
}
}
}