use std::path::Path;
use super::traits::{EspReader, EspWriter, RawEspData};
#[derive(Debug, Clone, Default)]
pub struct DefaultEspReader;
impl EspReader for DefaultEspReader {
fn read(&self, path: &Path) -> Result<RawEspData, Box<dyn std::error::Error>> {
let bytes = std::fs::read(path)?;
Ok(RawEspData { bytes })
}
}
#[derive(Debug, Clone, Default)]
pub struct DefaultEspWriter;
impl EspWriter for DefaultEspWriter {
fn write(&self, data: &RawEspData, path: &Path) -> Result<(), Box<dyn std::error::Error>> {
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)?;
}
std::fs::write(path, &data.bytes)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_esp_reader() {
let temp_dir = std::env::temp_dir();
let test_file = temp_dir.join("test_esp_reader.esp");
let test_data = b"TES4\x00\x00\x00\x00";
std::fs::write(&test_file, test_data).unwrap();
let reader = DefaultEspReader;
let result = reader.read(&test_file).unwrap();
assert_eq!(result.bytes, test_data);
std::fs::remove_file(&test_file).unwrap();
}
#[test]
fn test_default_esp_writer() {
let temp_dir = std::env::temp_dir();
let test_file = temp_dir.join("test_esp_writer.esp");
let test_data = RawEspData {
bytes: b"TES4\x00\x00\x00\x00".to_vec(),
};
let writer = DefaultEspWriter;
writer.write(&test_data, &test_file).unwrap();
let written_data = std::fs::read(&test_file).unwrap();
assert_eq!(written_data, test_data.bytes);
std::fs::remove_file(&test_file).unwrap();
}
#[test]
fn test_writer_creates_parent_dirs() {
let temp_dir = std::env::temp_dir();
let nested_dir = temp_dir.join("test_esp_nested").join("subdir");
let test_file = nested_dir.join("test.esp");
let test_data = RawEspData {
bytes: vec![1, 2, 3, 4],
};
let writer = DefaultEspWriter;
writer.write(&test_data, &test_file).unwrap();
assert!(test_file.exists());
std::fs::remove_dir_all(temp_dir.join("test_esp_nested")).unwrap();
}
}