use std::{collections::HashMap, fs::File, path::PathBuf};
use crate::arena::action::Action;
use super::Historian;
#[derive(Debug, Clone)]
pub struct DirectoryHistorian {
base_path: PathBuf,
sequence: HashMap<u128, Vec<Action>>,
}
impl DirectoryHistorian {
pub fn new(base_path: PathBuf) -> Self {
DirectoryHistorian {
base_path,
sequence: HashMap::new(),
}
}
}
impl Historian for DirectoryHistorian {
fn record_action(
&mut self,
id: u128,
_game_state: &crate::arena::GameState,
action: crate::arena::action::Action,
) -> Result<(), super::HistorianError> {
if !self.base_path.exists() {
std::fs::create_dir_all(&self.base_path)?;
}
let game_path = self.base_path.join(id.to_string()).with_extension("json");
let file = File::create(game_path)?;
let sequence = self.sequence.entry(id).or_default();
sequence.push(action);
Ok(serde_json::to_writer_pretty(&file, sequence)?)
}
}