brakes 0.1.0

A distributed rate limiting library
Documentation
use super::{Backend, BackendError};

#[derive(Clone)]
pub struct MemCache {
    client: memcache::Client,
}

impl MemCache {
    pub fn new(client: memcache::Client) -> Self {
        MemCache { client }
    }
}

impl Backend for MemCache {
    fn get(&self, key: &str) -> Result<(Vec<u8>, Option<u64>), BackendError> {
        let (v, _, cas) = match self.client.get(&key) {
            Ok(Some(v)) => v,
            Ok(None) => return Err(BackendError::KeyMissing),
            Err(e) => return Err(BackendError::MemCacheError(e)),
        };
        Ok((v, cas))
    }

    fn set(&self, key: &str, value: &Vec<u8>, cas: Option<u64>) -> Result<(), BackendError> {
        match cas {
            Some(cas) => match self.client.cas(&key, &value[..], u32::MAX, cas) {
                Ok(false) => return Err(BackendError::ValueChanged),
                Err(e) => return Err(BackendError::MemCacheError(e)),
                Ok(true) => Ok(()),
            },
            None => self
                .client
                .set(&key, &value[..], u32::MAX)
                .map_err(|e| BackendError::MemCacheError(e)),
        }
    }
}