Struct cache::persistent::client::Client

source ·
pub struct Client { /* private fields */ }
Expand description

A gRPC cache client.

The semantics of the Client API are the same as those of the NamespaceCache API.

Implementations§

source§

impl Client

source

pub fn with_default_config(kind: ClientKind, url: impl Into<String>) -> Self

Creates a new gRPC cache client for a server at url with default configuration values.

source

pub fn builder() -> ClientBuilder

Creates a new gRPC cache client.

source

pub fn local(url: impl Into<String>) -> ClientBuilder

Creates a new local gRPC cache client.

See ClientKind for an explanation of the different kinds of clients.

source

pub fn remote(url: impl Into<String>) -> ClientBuilder

Creates a new remote gRPC cache client.

See ClientKind for an explanation of the different kinds of clients.

source

pub fn generate<K: Serialize + Any + Send + Sync, V: Serialize + DeserializeOwned + Send + Sync + Any>( &self, namespace: impl Into<Namespace>, key: K, generate_fn: impl GenerateFn<K, V> ) -> CacheHandle<V>

Ensures that a value corresponding to key is generated, using generate_fn to generate it if it has not already been generated.

Returns a handle to the value. If the value is not yet generated, it is generated in the background.

For more detailed examples, refer to NamespaceCache::generate.

§Examples
use cache::{persistent::client::{Client, ClientKind}, error::Error, Cacheable};

let client = Client::with_default_config(ClientKind::Local, "http://127.0.0.1:28055");

fn generate_fn(tuple: &(u64, u64)) -> u64 {
    tuple.0 + tuple.1
}

let handle = client.generate("example.namespace", (5, 6), generate_fn);
assert_eq!(*handle.get(), 11);
source

pub fn generate_with_state<K: Serialize + Send + Sync + Any, V: Serialize + DeserializeOwned + Send + Sync + Any, S: Send + Sync + Any>( &self, namespace: impl Into<Namespace>, key: K, state: S, generate_fn: impl GenerateWithStateFn<K, S, V> ) -> CacheHandle<V>

Ensures that a value corresponding to key is generated, using generate_fn to generate it if it has not already been generated.

Returns a handle to the value. If the value is not yet generated, it is generated in the background.

For more detailed examples, refer to NamespaceCache::generate_with_state.

§Examples
use std::sync::{Arc, Mutex};
use cache::{persistent::client::{Client, ClientKind}, error::Error, Cacheable};

#[derive(Clone)]
pub struct Log(Arc<Mutex<Vec<(u64, u64)>>>);

let client = Client::with_default_config(ClientKind::Local, "http://127.0.0.1:28055");
let log = Log(Arc::new(Mutex::new(Vec::new())));

fn generate_fn(tuple: &(u64, u64), state: Log) -> u64 {
    println!("Logging parameters...");
    state.0.lock().unwrap().push(*tuple);
    tuple.0 + tuple.1
}

let handle = client.generate_with_state(
    "example.namespace", (5, 6), log.clone(), generate_fn
);
assert_eq!(*handle.get(), 11);
assert_eq!(log.0.lock().unwrap().clone(), vec![(5, 6)]);
source

pub fn generate_result<K: Serialize + Any + Send + Sync, V: Serialize + DeserializeOwned + Send + Sync + Any, E: Send + Sync + Any>( &self, namespace: impl Into<Namespace>, key: K, generate_fn: impl GenerateResultFn<K, V, E> ) -> CacheHandle<Result<V, E>>

Ensures that a result corresponding to key is generated, using generate_fn to generate it if it has not already been generated.

Does not cache on failure as errors are not constrained to be serializable/deserializable. As such, failures should happen quickly, or should be serializable and stored as part of cached value using Client::generate.

Returns a handle to the value. If the value is not yet generated, it is generated in the background.

For more detailed examples, refer to NamespaceCache::generate_result.

§Examples
use cache::{persistent::client::{Client, ClientKind}, error::Error, Cacheable};

let client = Client::with_default_config(ClientKind::Local, "http://127.0.0.1:28055");

fn generate_fn(tuple: &(u64, u64)) -> anyhow::Result<u64> {
    if *tuple == (5, 5) {
        Err(anyhow::anyhow!("invalid tuple"))
    } else {
        Ok(tuple.0 + tuple.1)
    }
}

let handle = client.generate_result("example.namespace", (5, 5), generate_fn);
assert_eq!(format!("{}", handle.unwrap_err_inner().root_cause()), "invalid tuple");
source

pub fn generate_result_with_state<K: Serialize + Send + Sync + Any, V: Serialize + DeserializeOwned + Send + Sync + Any, E: Send + Sync + Any, S: Send + Sync + Any>( &self, namespace: impl Into<Namespace>, key: K, state: S, generate_fn: impl GenerateResultWithStateFn<K, S, V, E> ) -> CacheHandle<Result<V, E>>

Ensures that a value corresponding to key is generated, using generate_fn to generate it if it has not already been generated.

Does not cache on failure as errors are not constrained to be serializable/deserializable. As such, failures should happen quickly, or should be serializable and stored as part of cached value using Client::generate_with_state.

Returns a handle to the value. If the value is not yet generated, it is generated in the background.

For more detailed examples, refer to NamespaceCache::generate_result_with_state.

§Examples
use std::sync::{Arc, Mutex};
use cache::{persistent::client::{Client, ClientKind}, error::Error, Cacheable};

#[derive(Clone)]
pub struct Log(Arc<Mutex<Vec<(u64, u64)>>>);

let client = Client::with_default_config(ClientKind::Local, "http://127.0.0.1:28055");
let log = Log(Arc::new(Mutex::new(Vec::new())));

fn generate_fn(tuple: &(u64, u64), state: Log) -> anyhow::Result<u64> {
    println!("Logging parameters...");
    state.0.lock().unwrap().push(*tuple);

    if *tuple == (5, 5) {
        Err(anyhow::anyhow!("invalid tuple"))
    } else {
        Ok(tuple.0 + tuple.1)
    }
}

let handle = client.generate_result_with_state(
    "example.namespace", (5, 5), log.clone(), generate_fn,
);
assert_eq!(format!("{}", handle.unwrap_err_inner().root_cause()), "invalid tuple");
assert_eq!(log.0.lock().unwrap().clone(), vec![(5, 5)]);
source

pub fn get<K: Cacheable>( &self, namespace: impl Into<Namespace>, key: K ) -> CacheHandle<Result<K::Output, K::Error>>

Gets a handle to a cacheable object from the cache, generating the object in the background if needed.

Does not cache errors, so any errors thrown should be thrown quickly. Any errors that need to be cached should be included in the cached output or should be cached using Client::get_with_err.

For more detailed examples, refer to NamespaceCache::get.

§Examples
use cache::{persistent::client::{Client, ClientKind}, error::Error, Cacheable};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Hash, Eq, PartialEq)]
pub struct Params {
    param1: u64,
    param2: String,
};

impl Cacheable for Params {
    type Output = u64;
    type Error = anyhow::Error;

    fn generate(&self) -> anyhow::Result<u64> {
        Ok(2 * self.param1)
    }
}

let client = Client::with_default_config(ClientKind::Local, "http://127.0.0.1:28055");

let handle = client.get(
    "example.namespace", Params { param1: 50, param2: "cache".to_string() }
);
assert_eq!(*handle.unwrap_inner(), 100);
source

pub fn get_with_err<E: Send + Sync + Serialize + DeserializeOwned + Any, K: Cacheable<Error = E>>( &self, namespace: impl Into<Namespace>, key: K ) -> CacheHandle<Result<K::Output, K::Error>>

Gets a handle to a cacheable object from the cache, caching failures as well.

Generates the object in the background if needed.

For more detailed examples, refer to NamespaceCache::get_with_err.

§Examples
use cache::{persistent::client::{Client, ClientKind}, error::Error, Cacheable};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Hash, Eq, PartialEq)]
pub struct Params {
    param1: u64,
    param2: String,
};

impl Cacheable for Params {
    type Output = u64;
    type Error = String;

    fn generate(&self) -> Result<Self::Output, Self::Error> {
        if self.param1 == 5 {
            Err("invalid param".to_string())
        } else {
            Ok(2 * self.param1)
        }
    }
}

let client = Client::with_default_config(ClientKind::Local, "http://127.0.0.1:28055");

let handle = client.get_with_err(
    "example.namespace", Params { param1: 5, param2: "cache".to_string() }
);
assert_eq!(handle.unwrap_err_inner(), "invalid param");
source

pub fn get_with_state<S: Send + Sync + Any, K: CacheableWithState<S>>( &self, namespace: impl Into<Namespace>, key: K, state: S ) -> CacheHandle<Result<K::Output, K::Error>>

Gets a handle to a cacheable object from the cache, generating the object in the background if needed.

Does not cache errors, so any errors thrown should be thrown quickly. Any errors that need to be cached should be included in the cached output or should be cached using Client::get_with_state_and_err.

For more detailed examples, refer to NamespaceCache::get_with_state.

§Examples
use std::sync::{Arc, Mutex};
use cache::{persistent::client::{Client, ClientKind}, error::Error, CacheableWithState};
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize, Clone, Hash, Eq, PartialEq)]
pub struct Params(u64);

#[derive(Clone)]
pub struct Log(Arc<Mutex<Vec<Params>>>);

impl CacheableWithState<Log> for Params {
    type Output = u64;
    type Error = anyhow::Error;

    fn generate_with_state(&self, state: Log) -> anyhow::Result<u64> {
        println!("Logging parameters...");
        state.0.lock().unwrap().push(self.clone());
        Ok(2 * self.0)
    }
}

let client = Client::with_default_config(ClientKind::Local, "http://127.0.0.1:28055");
let log = Log(Arc::new(Mutex::new(Vec::new())));

let handle = client.get_with_state(
    "example.namespace",
    Params(0),
    log.clone(),
);
assert_eq!(*handle.unwrap_inner(), 0);
assert_eq!(log.0.lock().unwrap().clone(), vec![Params(0)]);
source

pub fn get_with_state_and_err<S: Send + Sync + Any, E: Send + Sync + Serialize + DeserializeOwned + Any, K: CacheableWithState<S, Error = E>>( &self, namespace: impl Into<Namespace>, key: K, state: S ) -> CacheHandle<Result<K::Output, K::Error>>

Gets a handle to a cacheable object from the cache, caching failures as well.

Generates the object in the background if needed.

See Client::get_with_err and Client::get_with_state for related examples.

Trait Implementations§

source§

impl Clone for Client

source§

fn clone(&self) -> Client

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Client

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl !RefUnwindSafe for Client

§

impl Send for Client

§

impl Sync for Client

§

impl Unpin for Client

§

impl !UnwindSafe for Client

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more