use std::fmt;
mod ascii;
pub use ascii::{parse_ascii_metadump_response, parse_ascii_response, parse_ascii_stats_response};
#[derive(Clone, Debug, PartialEq)]
pub struct Value {
pub key: Vec<u8>,
pub cas: Option<u64>,
pub flags: u32,
pub data: Vec<u8>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Status {
Stored,
NotStored,
Deleted,
Touched,
Exists,
NotFound,
Error(ErrorKind),
}
#[derive(Clone, Debug, PartialEq)]
pub enum ErrorKind {
Generic(String),
NonexistentCommand,
Protocol(Option<String>),
Client(String),
Server(String),
}
#[derive(Clone, Debug, PartialEq)]
pub enum Response {
Status(Status),
Data(Option<Vec<Value>>),
IncrDecr(u64),
}
#[derive(Clone, Debug, PartialEq)]
pub enum MetadumpResponse {
Busy(String),
BadClass(String),
Entry(KeyMetadata),
End,
}
#[derive(Clone, Debug, PartialEq)]
pub enum StatsResponse {
Entry(String, String),
End,
}
#[derive(Clone, Debug, PartialEq)]
pub struct KeyMetadata {
pub key: Vec<u8>,
pub expiration: i64,
pub last_accessed: u64,
pub cas: u64,
pub fetched: bool,
pub class_id: u32,
pub size: u32,
}
impl fmt::Display for Status {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Stored => write!(f, "stored"),
Self::NotStored => write!(f, "not stored"),
Self::Deleted => write!(f, "deleted"),
Self::Touched => write!(f, "touched"),
Self::Exists => write!(f, "exists"),
Self::NotFound => write!(f, "not found"),
Self::Error(ek) => write!(f, "error: {}", ek),
}
}
}
impl fmt::Display for ErrorKind {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Generic(s) => write!(f, "generic: {}", s),
Self::NonexistentCommand => write!(f, "command does not exist"),
Self::Protocol(s) => match s {
Some(s) => write!(f, "protocol: {}", s),
None => write!(f, "protocol"),
},
Self::Client(s) => write!(f, "client: {}", s),
Self::Server(s) => write!(f, "server: {}", s),
}
}
}
impl From<MetadumpResponse> for Status {
fn from(resp: MetadumpResponse) -> Self {
match resp {
MetadumpResponse::BadClass(s) => {
Status::Error(ErrorKind::Generic(format!("BADCLASS {}", s)))
}
MetadumpResponse::Busy(s) => Status::Error(ErrorKind::Generic(format!("BUSY {}", s))),
_ => unreachable!("Metadump Entry/End states should never be used as a Status!"),
}
}
}