infinispan-fork 0.1.0

Rust client for the Infinispan REST API with DIGEST auth for version > 12.0.x
Documentation
use crate::request::caches::CACHES_ENDPOINT;
use crate::request::{Method, Request, ToHttpRequest};
use std::collections::HashMap;
use std::time::Duration;

const TTL_HEADER: &str = "timeToLiveSeconds";

#[derive(Debug)]
pub struct CreateEntryReq {
    cache_name: String,
    entry_name: String,
    value: Option<String>,
    ttl: Option<Duration>,
}

impl CreateEntryReq {
    pub fn new(cache_name: impl Into<String>, entry_name: impl Into<String>) -> Self {
        Self {
            cache_name: cache_name.into(),
            entry_name: entry_name.into(),
            value: None,
            ttl: None,
        }
    }

    pub fn with_value(mut self, value: String) -> Self {
        self.value = Some(value);
        self
    }

    pub fn with_ttl(mut self, ttl: Duration) -> Self {
        self.ttl = Some(ttl);
        self
    }
}

impl From<&CreateEntryReq> for Request {
    fn from(request: &CreateEntryReq) -> Self {
        let mut headers = HashMap::new();

        if let Some(ttl) = request.ttl {
            headers.insert(TTL_HEADER.into(), ttl.as_secs().to_string());
        }

        Self::new(
            Method::Post,
            entry_url(&request.cache_name, &request.entry_name),
            headers,
            request.value.clone(),
        )
    }
}

impl ToHttpRequest for CreateEntryReq {
    fn to_http_req(
        &self,
        base_url: impl AsRef<str>,
    ) -> http::Request<String> {
        Request::from(self).to_http_req(base_url)
    }
}

pub fn create(cache_name: impl Into<String>, entry_name: impl Into<String>) -> CreateEntryReq {
    CreateEntryReq::new(cache_name, entry_name)
}

pub fn get(cache_name: impl AsRef<str>, entry_name: impl AsRef<str>) -> Request {
    Request::new(
        Method::Get,
        entry_url(cache_name, entry_name),
        HashMap::new(),
        None,
    )
}

pub fn exists(cache_name: impl AsRef<str>, entry_name: impl AsRef<str>) -> Request {
    Request::new(
        Method::Head,
        entry_url(cache_name, entry_name),
        HashMap::new(),
        None,
    )
}

pub fn update(
    cache_name: impl AsRef<str>,
    entry_name: impl AsRef<str>,
    value: impl Into<String>,
) -> Request {
    Request::new(
        Method::Put,
        entry_url(cache_name, entry_name),
        HashMap::new(),
        Some(value.into()),
    )
}

pub fn delete(cache_name: impl AsRef<str>, entry_name: impl AsRef<str>) -> Request {
    Request::new(
        Method::Delete,
        entry_url(cache_name, entry_name),
        HashMap::new(),
        None,
    )
}

fn entry_url(cache_name: impl AsRef<str>, entry_name: impl AsRef<str>) -> String {
    format!(
        "{caches_endpoint}/{cache_name}/{entry_name}",
        caches_endpoint = CACHES_ENDPOINT,
        cache_name = urlencoding::encode(cache_name.as_ref()),
        entry_name = urlencoding::encode(entry_name.as_ref())
    )
}