use crate::{Direction, Trial};
use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub struct StudyMetadata {
pub study_name: String,
pub direction: Direction,
}
#[derive(Debug)]
pub enum StorageError {
StudyNotFound(String),
Serialization(String),
SchemaMismatch { found: i64, expected: i64 },
Backend(String),
}
impl fmt::Display for StorageError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
StorageError::StudyNotFound(name) => write!(f, "study not found: {name}"),
StorageError::Serialization(msg) => write!(f, "serialization error: {msg}"),
StorageError::SchemaMismatch { found, expected } => write!(
f,
"storage schema version mismatch: found {found}, expected {expected}"
),
StorageError::Backend(msg) => write!(f, "storage backend error: {msg}"),
}
}
}
impl std::error::Error for StorageError {}
pub trait Storage: Send + Sync {
fn save_trial(&self, study_name: &str, trial: &Trial) -> Result<(), StorageError>;
fn load_trials(&self, study_name: &str) -> Result<Vec<Trial>, StorageError>;
fn save_study_metadata(&self, meta: &StudyMetadata) -> Result<(), StorageError>;
fn load_study_metadata(&self, study_name: &str)
-> Result<Option<StudyMetadata>, StorageError>;
}