use std::{
fs::File,
io::{
Read,
Write
}
};
use libutils_console::{
Metadata as MetadataTrait,
Descriptor as DescriptorTrait
};
use libutils_issue::{
Issue,
Severity
};
use super::metadata::Metadata;
use core::mem::transmute_neo as transmute;
pub struct Descriptor {
pub file: File
}
impl DescriptorTrait for Descriptor {
fn metadata(&self) -> Result<impl MetadataTrait, Issue> {return match self.file.metadata() {
Ok(metadata) => Ok(unsafe {transmute::<_, Metadata>(metadata)}),
Err(error) => Err(Issue {
name: "Failed to read size of file",
description: Some(error.to_string()),
severity: Severity::Error
})
}}
fn read_bytes(&mut self) -> Result<Vec<u8>, Issue> {
let mut buffer = Vec::with_capacity(self.metadata()?.size());
match self.file.read(&mut buffer) {
Ok(_) => Ok(buffer),
Err(error) => Err(Issue {
name: "Failed to read file as binary",
description: Some(error.to_string()),
severity: Severity::Error
})
}
}
fn write_bytes(&mut self, content: &[u8]) -> Result<(), Issue> {return match self.file.write(content) {
Ok(_) => Ok(()),
Err(error) => Err(Issue {
name: "Failure writing to file",
description: Some(error.to_string()),
severity: Severity::Error
})
}}
}