use serde_json::Value;
#[derive(Debug, PartialEq)]
pub enum ManifestError {
FileNotFound(String),
AmbiguousFile(String),
ParseError(String),
}
impl std::fmt::Display for ManifestError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ManifestError::FileNotFound(msg) => write!(f, "FileNotFound: {}", msg),
ManifestError::AmbiguousFile(msg) => write!(f, "AmbiguousFile: {}", msg),
ManifestError::ParseError(msg) => write!(f, "ParseError: {}", msg),
}
}
}
#[derive(Debug, PartialEq)]
pub enum LoadError {
ClientNotConfigured,
ConfigMissing(String),
NotFound(String),
ParseError(String),
}
impl std::fmt::Display for LoadError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LoadError::ClientNotConfigured => write!(f, "ClientNotConfigured"),
LoadError::ConfigMissing(msg) => write!(f, "ConfigMissing: {}", msg),
LoadError::NotFound(msg) => write!(f, "NotFound: {}", msg),
LoadError::ParseError(msg) => write!(f, "ParseError: {}", msg),
}
}
}
#[derive(Debug, PartialEq)]
pub enum StoreError {
ClientNotConfigured,
ConfigMissing(String),
SerializeError(String),
UnsupportedClient(u64),
}
impl std::fmt::Display for StoreError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
StoreError::ClientNotConfigured => write!(f, "ClientNotConfigured"),
StoreError::ConfigMissing(msg) => write!(f, "ConfigMissing: {}", msg),
StoreError::SerializeError(msg) => write!(f, "SerializeError: {}", msg),
StoreError::UnsupportedClient(id) => write!(f, "UnsupportedClient: {}", id),
}
}
}
#[derive(Debug, PartialEq)]
pub enum StateError {
ManifestLoadFailed(String),
KeyNotFound(String),
RecursionLimitExceeded,
StoreFailed(StoreError),
LoadFailed(LoadError),
}
impl std::fmt::Display for StateError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
StateError::ManifestLoadFailed(msg) => write!(f, "ManifestLoadFailed: {}", msg),
StateError::KeyNotFound(msg) => write!(f, "KeyNotFound: {}", msg),
StateError::RecursionLimitExceeded => write!(f, "RecursionLimitExceeded"),
StateError::StoreFailed(e) => write!(f, "StoreFailed: {}", e),
StateError::LoadFailed(e) => write!(f, "LoadFailed: {}", e),
}
}
}
pub trait State {
fn get(&mut self, key: &str) -> Result<Option<Value>, StateError>;
fn set(&mut self, key: &str, value: Value, ttl: Option<u64>) -> Result<bool, StateError>;
fn delete(&mut self, key: &str) -> Result<bool, StateError>;
fn exists(&mut self, key: &str) -> Result<bool, StateError>;
}