use std::ffi::OsStr;
use std::fmt;
use std::path::Path;
pub struct Disk {
pub(crate) inner: crate::DiskInner,
}
impl Disk {
pub fn kind(&self) -> DiskKind {
self.inner.kind()
}
pub fn name(&self) -> &OsStr {
self.inner.name()
}
pub fn file_system(&self) -> &OsStr {
self.inner.file_system()
}
pub fn mount_point(&self) -> &Path {
self.inner.mount_point()
}
pub fn total_space(&self) -> u64 {
self.inner.total_space()
}
pub fn available_space(&self) -> u64 {
self.inner.available_space()
}
pub fn is_removable(&self) -> bool {
self.inner.is_removable()
}
pub fn refresh(&mut self) -> bool {
self.inner.refresh()
}
}
pub struct Disks {
inner: crate::DisksInner,
}
impl Default for Disks {
fn default() -> Self {
Self::new()
}
}
impl From<Disks> for Vec<Disk> {
fn from(disks: Disks) -> Vec<Disk> {
disks.inner.into_vec()
}
}
impl From<Vec<Disk>> for Disks {
fn from(disks: Vec<Disk>) -> Self {
Self {
inner: crate::DisksInner::from_vec(disks),
}
}
}
impl<'a> IntoIterator for &'a Disks {
type Item = &'a Disk;
type IntoIter = std::slice::Iter<'a, Disk>;
fn into_iter(self) -> Self::IntoIter {
self.list().iter()
}
}
impl<'a> IntoIterator for &'a mut Disks {
type Item = &'a mut Disk;
type IntoIter = std::slice::IterMut<'a, Disk>;
fn into_iter(self) -> Self::IntoIter {
self.list_mut().iter_mut()
}
}
impl Disks {
pub fn new() -> Self {
Self {
inner: crate::DisksInner::new(),
}
}
pub fn new_with_refreshed_list() -> Self {
let mut disks = Self::new();
disks.refresh_list();
disks
}
pub fn list(&self) -> &[Disk] {
self.inner.list()
}
pub fn list_mut(&mut self) -> &mut [Disk] {
self.inner.list_mut()
}
pub fn refresh(&mut self) {
for disk in self.list_mut() {
disk.refresh();
}
}
pub fn refresh_list(&mut self) {
self.inner.refresh_list();
}
}
impl std::ops::Deref for Disks {
type Target = [Disk];
fn deref(&self) -> &Self::Target {
self.list()
}
}
impl std::ops::DerefMut for Disks {
fn deref_mut(&mut self) -> &mut Self::Target {
self.list_mut()
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum DiskKind {
HDD,
SSD,
Unknown(isize),
}
impl fmt::Display for DiskKind {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match *self {
DiskKind::HDD => "HDD",
DiskKind::SSD => "SSD",
_ => "Unknown",
})
}
}