use alloc::string::String;
use alloc::vec::Vec;
use core::fmt;
pub trait Context {
fn get(&mut self, key: &str) -> Result<Option<Tree>, ContextError>;
fn set(&mut self, key: &str, value: Tree) -> Result<bool, ContextError>;
fn delete(&mut self, key: &str) -> Result<bool, ContextError>;
fn exists(&mut self, key: &str) -> Result<bool, ContextError>;
}
#[derive(Debug, PartialEq, Clone)]
pub enum Tree {
Scalar(Vec<u8>),
Sequence(Vec<Tree>),
Mapping(Vec<(Vec<u8>, Tree)>),
Null,
}
#[derive(Debug, PartialEq)]
pub enum DslError {
FileNotFound(String),
AmbiguousFile(String),
ParseError(String),
LimitExceeded(String),
}
impl fmt::Display for DslError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DslError::FileNotFound(msg) => write!(f, "FileNotFound: {}", msg),
DslError::AmbiguousFile(msg) => write!(f, "AmbiguousFile: {}", msg),
DslError::ParseError(msg) => write!(f, "ParseError: {}", msg),
DslError::LimitExceeded(msg) => write!(f, "LimitExceeded: {}", msg),
}
}
}
#[derive(Debug, PartialEq)]
pub enum LoadError {
ClientNotFound(String),
ConfigMissing(String),
NotFound(String),
ParseError(String),
}
impl fmt::Display for LoadError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
LoadError::ClientNotFound(msg) => write!(f, "ClientNotFound: {}", msg),
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 {
ClientNotFound(String),
ConfigMissing(String),
SerializeError(String),
}
impl fmt::Display for StoreError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
StoreError::ClientNotFound(msg) => write!(f, "ClientNotFound: {}", msg),
StoreError::ConfigMissing(msg) => write!(f, "ConfigMissing: {}", msg),
StoreError::SerializeError(msg) => write!(f, "SerializeError: {}", msg),
}
}
}
#[derive(Debug, PartialEq)]
pub enum ContextError {
ParseFailed(String),
KeyNotFound(String),
RecursionLimitExceeded,
StoreFailed(StoreError),
LoadFailed(LoadError),
}
impl fmt::Display for ContextError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ContextError::ParseFailed(msg) => write!(f, "ParseFailed: {}", msg),
ContextError::KeyNotFound(msg) => write!(f, "KeyNotFound: {}", msg),
ContextError::RecursionLimitExceeded => write!(f, "RecursionLimitExceeded"),
ContextError::StoreFailed(e) => write!(f, "StoreFailed: {}", e),
ContextError::LoadFailed(e) => write!(f, "LoadFailed: {}", e),
}
}
}