use crate::error::MemcacheError;
use super::value::FromValue;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GetStatus {
Hit,
Miss,
Pending,
Unchanged,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MutationStatus {
Stored,
NotFound,
AlreadyExists,
CasMismatch,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ValueState {
Fresh,
Stale,
Missing,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LeaseState {
None,
Granted,
Busy,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct ItemMeta {
pub cas: Option<u64>,
pub ttl: Option<i64>,
pub size: Option<u64>,
pub last_access: Option<u64>,
pub hit_before: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GetResult {
pub key: Vec<u8>,
pub status: GetStatus,
pub value: Option<Vec<u8>>,
pub client_flags: Option<u32>,
pub item: ItemMeta,
pub value_state: ValueState,
pub lease_state: LeaseState,
}
impl GetResult {
pub fn hit(&self) -> bool {
self.status == GetStatus::Hit
}
pub fn decode<V: FromValue>(self) -> Result<Option<V>, MemcacheError> {
let flags = self.client_flags.unwrap_or(0);
self.value.map(|value| V::from_value(value, flags)).transpose()
}
pub fn is_stale(&self) -> bool {
self.value_state == ValueState::Stale
}
pub fn won_lease(&self) -> bool {
self.lease_state == LeaseState::Granted
}
pub fn lease_busy(&self) -> bool {
self.lease_state == LeaseState::Busy
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MutationResult {
pub key: Vec<u8>,
pub status: MutationStatus,
pub cas: Option<u64>,
}
impl MutationResult {
pub fn stored(&self) -> bool {
self.status == MutationStatus::Stored
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ArithmeticResult {
pub key: Vec<u8>,
pub status: MutationStatus,
pub value: Option<u64>,
pub item: ItemMeta,
}
impl ArithmeticResult {
pub fn stored(&self) -> bool {
self.status == MutationStatus::Stored
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OpResult {
Get(GetResult),
Mutation(MutationResult),
Arithmetic(ArithmeticResult),
}
impl OpResult {
pub fn as_get(&self) -> Option<&GetResult> {
match self {
OpResult::Get(result) => Some(result),
_ => None,
}
}
pub fn as_mutation(&self) -> Option<&MutationResult> {
match self {
OpResult::Mutation(result) => Some(result),
_ => None,
}
}
pub fn as_arithmetic(&self) -> Option<&ArithmeticResult> {
match self {
OpResult::Arithmetic(result) => Some(result),
_ => None,
}
}
}