1use crate::{Direction, Trial};
2use std::fmt;
3
4#[derive(Debug, Clone, PartialEq)]
6pub struct StudyMetadata {
7 pub study_name: String,
8 pub direction: Direction,
9}
10
11#[derive(Debug)]
13pub enum StorageError {
14 StudyNotFound(String),
16 Serialization(String),
18 SchemaMismatch { found: i64, expected: i64 },
20 Backend(String),
22}
23
24impl fmt::Display for StorageError {
25 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26 match self {
27 StorageError::StudyNotFound(name) => write!(f, "study not found: {name}"),
28 StorageError::Serialization(msg) => write!(f, "serialization error: {msg}"),
29 StorageError::SchemaMismatch { found, expected } => write!(
30 f,
31 "storage schema version mismatch: found {found}, expected {expected}"
32 ),
33 StorageError::Backend(msg) => write!(f, "storage backend error: {msg}"),
34 }
35 }
36}
37
38impl std::error::Error for StorageError {}
39
40pub trait Storage: Send + Sync {
47 fn save_trial(&self, study_name: &str, trial: &Trial) -> Result<(), StorageError>;
49
50 fn load_trials(&self, study_name: &str) -> Result<Vec<Trial>, StorageError>;
53
54 fn save_study_metadata(&self, meta: &StudyMetadata) -> Result<(), StorageError>;
56
57 fn load_study_metadata(&self, study_name: &str)
59 -> Result<Option<StudyMetadata>, StorageError>;
60}