use serde::{Deserialize, Serialize};
use thiserror::Error;
pub trait SpecialFileOperations {
fn create_special_file(
&mut self,
file_name: String,
file_type: SpecialFileType,
input: Option<Vec<u8>>,
) -> SfoResult<()>;
fn remove_special_file(
&mut self,
file_name: String,
file_type: SpecialFileType,
) -> SfoResult<()>;
fn write_to_special_file(
&self,
file_name: String,
file_type: SpecialFileType,
contents: Vec<u8>,
append: bool,
) -> SfoResult<()>;
fn read_from_special_file(
&self,
file_name: String,
file_type: SpecialFileType,
) -> SfoResult<Vec<u8>>;
fn get_special_file_path(
&self,
file_name: String,
file_type: SpecialFileType,
) -> SfoResult<String>;
}
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
pub enum SpecialFileType {
Data,
Cache,
Temporary,
}
impl TryFrom<String> for SpecialFileType {
type Error = SfoError;
fn try_from(value: String) -> Result<Self, Self::Error> {
match value.to_ascii_lowercase().as_str() {
"data" => Ok(SpecialFileType::Data),
"cache" => Ok(SpecialFileType::Cache),
"temporary" | "temp" | "tmp" => Ok(SpecialFileType::Temporary),
_ => Err(SfoError::Generic(format!(
"Could not create SpecialFileType from {}",
value
))),
}
}
}
#[derive(Error, Debug, PartialEq, Eq, Clone)]
#[repr(C)]
pub enum SfoError {
#[error("Special File Operations error: {0}")]
Generic(String),
#[error("Special file already exists")]
FileExists,
#[error("Special file not found")]
FileNotFound,
}
pub type SfoResult<T> = Result<T, SfoError>;