use std::fs::{self, File};
use std::io::BufReader;
use crate::SessionManifest;
use crate::TurnIndex;
use crate::error::SessionStoreError;
pub struct ManifestStore {
session_dir: std::path::PathBuf,
}
impl ManifestStore {
pub(crate) fn new(session_dir: std::path::PathBuf) -> Self {
Self { session_dir }
}
fn manifest_path(&self) -> std::path::PathBuf {
self.session_dir.join("manifest.json")
}
fn turns_path(&self) -> std::path::PathBuf {
self.session_dir.join("index").join("turns.json")
}
pub(crate) fn load_manifest(&self) -> Result<Option<SessionManifest>, SessionStoreError> {
let path = self.manifest_path();
if !path.exists() {
return Ok(None);
}
let file = File::open(&path).map_err(|e| SessionStoreError::io(path.clone(), e))?;
let reader = BufReader::new(file);
let manifest: SessionManifest =
serde_json::from_reader(reader).map_err(|e| SessionStoreError::io(path.clone(), e.into()))?;
Ok(Some(manifest))
}
pub(crate) fn load_turn_index(&self) -> Result<Option<TurnIndex>, SessionStoreError> {
let path = self.turns_path();
if !path.exists() {
return Ok(None);
}
let file = File::open(&path).map_err(|e| SessionStoreError::io(path.clone(), e))?;
let reader = BufReader::new(file);
let index: TurnIndex =
serde_json::from_reader(reader).map_err(|e| SessionStoreError::io(path.clone(), e.into()))?;
Ok(Some(index))
}
pub(crate) fn write_manifest(&self, manifest: &SessionManifest) -> Result<(), SessionStoreError> {
let path = self.manifest_path();
let bytes = serde_json::to_vec(manifest)?;
fs::write(&path, bytes).map_err(|e| SessionStoreError::io(path.clone(), e))
}
pub(crate) fn write_turn_index(&self, index: &TurnIndex) -> Result<(), SessionStoreError> {
let path = self.turns_path();
let bytes = serde_json::to_vec(index)?;
fs::write(&path, bytes).map_err(|e| SessionStoreError::io(path.clone(), e))
}
}