infinispan-fork 0.1.0

Rust client for the Infinispan REST API with DIGEST auth for version > 12.0.x
Documentation
pub mod modes;

use crate::request::caches::modes::*;
use crate::request::{Method, Request};
use serde::{Deserialize, Serialize};
use serde_json::json;
use std::collections::HashMap;

pub(crate) const CACHES_ENDPOINT: &str = "/rest/v2/caches";

#[derive(Eq, PartialEq, Debug, Serialize, Deserialize)]
pub enum Cache {
    #[serde(rename = "local-cache")]
    Local(Local),

    #[serde(rename = "replicated-cache")]
    Replicated(Replicated),

    #[serde(rename = "distributed-cache")]
    Distributed(Distributed),

    #[serde(rename = "invalidation-cache")]
    Invalidation(Invalidation),
}

#[derive(Debug)]
enum Action {
    Clear,
    Config,
    Keys,
    Size,
    Stats,
}

impl Action {
    pub fn to_query_args(&self) -> String {
        let mut query_args = format!("action={:?}", self);
        query_args.make_ascii_lowercase();
        query_args
    }
}

pub fn create_local(name: impl AsRef<str>) -> Request {
    create_cache(name, Cache::Local(Local::default()))
}

pub fn create_replicated_async(name: impl AsRef<str>) -> Request {
    create_cache(name, Cache::Replicated(Replicated::create_async()))
}

pub fn create_replicated_sync(name: impl AsRef<str>) -> Request {
    create_cache(name, Cache::Replicated(Replicated::create_sync()))
}

pub fn create_distributed_async(name: impl AsRef<str>) -> Request {
    create_cache(name, Cache::Distributed(Distributed::create_async()))
}

pub fn create_distributed_sync(name: impl AsRef<str>) -> Request {
    create_cache(name, Cache::Distributed(Distributed::create_sync()))
}

pub fn create_invalidation_async(name: impl AsRef<str>) -> Request {
    create_cache(name, Cache::Invalidation(Invalidation::create_async()))
}

pub fn create_invalidation_sync(name: impl AsRef<str>) -> Request {
    create_cache(name, Cache::Invalidation(Invalidation::create_sync()))
}

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

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

pub fn get_config(name: impl AsRef<str>) -> Request {
    Request::new(
        Method::Get,
        cache_url_with_action(name, &Action::Config),
        HashMap::new(),
        None,
    )
}

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

pub fn keys(name: impl AsRef<str>) -> Request {
    Request::new(
        Method::Get,
        cache_url_with_action(name, &Action::Keys),
        HashMap::new(),
        None,
    )
}

pub fn clear(name: impl AsRef<str>) -> Request {
    Request::new(
        Method::Post,
        cache_url_with_action(name, &Action::Clear),
        HashMap::new(),
        None,
    )
}

pub fn size(name: impl AsRef<str>) -> Request {
    Request::new(
        Method::Get,
        cache_url_with_action(name, &Action::Size),
        HashMap::new(),
        None,
    )
}

pub fn stats(name: impl AsRef<str>) -> Request {
    Request::new(
        Method::Get,
        cache_url_with_action(name, &Action::Stats),
        HashMap::new(),
        None,
    )
}

pub fn list() -> Request {
    Request::new(Method::Get, CACHES_ENDPOINT, HashMap::new(), None)
}

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

fn cache_url_with_action(name: impl AsRef<str>, action: &Action) -> String {
    format!("{}?{}", cache_url(name), action.to_query_args())
}

fn create_cache(name: impl AsRef<str>, cache: Cache) -> Request {
    Request::new(
        Method::Post,
        cache_url(name),
        HashMap::new(),
        Some(json!(cache).to_string()),
    )
}