use crate::codec::cache::{
from_wire_cache_delete_many_response, from_wire_cache_delete_response,
from_wire_cache_get_many_response, from_wire_cache_get_response,
from_wire_cache_touch_response, to_wire_cache_delete_many_request,
to_wire_cache_delete_request, to_wire_cache_get_many_request, to_wire_cache_get_request,
to_wire_cache_set_many_request, to_wire_cache_set_request, to_wire_cache_touch_request,
};
use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
use crate::generated::v1;
use crate::rpc_support::GestaltError;
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheDeleteManyRequest {
pub keys: Vec<String>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheDeleteManyResponse {
pub deleted: i64,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheDeleteRequest {
pub key: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheDeleteResponse {
pub deleted: bool,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheGetManyRequest {
pub keys: Vec<String>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheGetManyResponse {
pub entries: Vec<CacheResult>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheGetRequest {
pub key: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheGetResponse {
pub found: bool,
pub value: Vec<u8>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheResult {
pub key: String,
pub found: bool,
pub value: Vec<u8>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheSetEntry {
pub key: String,
pub value: Vec<u8>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheSetManyRequest {
pub entries: Vec<CacheSetEntry>,
pub ttl: Option<std::time::Duration>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheSetRequest {
pub key: String,
pub value: Vec<u8>,
pub ttl: Option<std::time::Duration>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheTouchRequest {
pub key: String,
pub ttl: Option<std::time::Duration>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CacheTouchResponse {
pub touched: bool,
}
pub struct Cache {
inner: v1::cache_client::CacheClient<HostServiceChannel>,
timeout: Option<std::time::Duration>,
}
impl Cache {
pub fn new(channel: tonic::transport::Channel) -> Self {
Self {
inner: v1::cache_client::CacheClient::new(plain_channel(channel)),
timeout: None,
}
}
pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub async fn connect() -> Result<Self, GestaltError> {
Self::connect_named("").await
}
pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
Ok(Self {
inner: v1::cache_client::CacheClient::new(connect_host_service("cache", name).await?),
timeout: None,
})
}
pub async fn get(&mut self, key: String) -> Result<Option<Vec<u8>>, GestaltError> {
let request = CacheGetRequest { key };
let mut tonic_request = tonic::Request::new(to_wire_cache_get_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response =
from_wire_cache_get_response(self.inner.get(tonic_request).await?.into_inner());
if !response.found {
return Ok(None);
}
Ok(Some(response.value))
}
pub async fn get_raw(
&mut self,
request: CacheGetRequest,
) -> Result<CacheGetResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_cache_get_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get(tonic_request).await?;
Ok(from_wire_cache_get_response(response.into_inner()))
}
pub async fn get_many(
&mut self,
keys: Vec<String>,
) -> Result<std::collections::BTreeMap<String, Vec<u8>>, GestaltError> {
let request = CacheGetManyRequest { keys };
let mut tonic_request = tonic::Request::new(to_wire_cache_get_many_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_cache_get_many_response(
self.inner.get_many(tonic_request).await?.into_inner(),
);
let mut out = std::collections::BTreeMap::new();
for entry in response.entries {
if entry.found {
out.insert(entry.key, entry.value);
}
}
Ok(out)
}
pub async fn get_many_raw(
&mut self,
request: CacheGetManyRequest,
) -> Result<CacheGetManyResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_cache_get_many_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_many(tonic_request).await?;
Ok(from_wire_cache_get_many_response(response.into_inner()))
}
pub async fn set(
&mut self,
key: String,
value: Vec<u8>,
ttl: Option<std::time::Duration>,
) -> Result<(), GestaltError> {
let request = CacheSetRequest { key, value, ttl };
let mut tonic_request = tonic::Request::new(to_wire_cache_set_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.set(tonic_request).await?;
Ok(())
}
pub async fn set_raw(&mut self, request: CacheSetRequest) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_cache_set_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.set(tonic_request).await?;
Ok(())
}
pub async fn set_many(
&mut self,
entries: Vec<CacheSetEntry>,
ttl: Option<std::time::Duration>,
) -> Result<(), GestaltError> {
let request = CacheSetManyRequest { entries, ttl };
let mut tonic_request = tonic::Request::new(to_wire_cache_set_many_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.set_many(tonic_request).await?;
Ok(())
}
pub async fn set_many_raw(&mut self, request: CacheSetManyRequest) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_cache_set_many_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.set_many(tonic_request).await?;
Ok(())
}
pub async fn delete(&mut self, key: String) -> Result<bool, GestaltError> {
let request = CacheDeleteRequest { key };
let mut tonic_request = tonic::Request::new(to_wire_cache_delete_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response =
from_wire_cache_delete_response(self.inner.delete(tonic_request).await?.into_inner());
Ok(response.deleted)
}
pub async fn delete_raw(
&mut self,
request: CacheDeleteRequest,
) -> Result<CacheDeleteResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_cache_delete_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.delete(tonic_request).await?;
Ok(from_wire_cache_delete_response(response.into_inner()))
}
pub async fn delete_many(&mut self, keys: Vec<String>) -> Result<i64, GestaltError> {
let request = CacheDeleteManyRequest { keys };
let mut tonic_request = tonic::Request::new(to_wire_cache_delete_many_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_cache_delete_many_response(
self.inner.delete_many(tonic_request).await?.into_inner(),
);
Ok(response.deleted)
}
pub async fn delete_many_raw(
&mut self,
request: CacheDeleteManyRequest,
) -> Result<CacheDeleteManyResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_cache_delete_many_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.delete_many(tonic_request).await?;
Ok(from_wire_cache_delete_many_response(response.into_inner()))
}
pub async fn touch(
&mut self,
key: String,
ttl: Option<std::time::Duration>,
) -> Result<bool, GestaltError> {
let request = CacheTouchRequest { key, ttl };
let mut tonic_request = tonic::Request::new(to_wire_cache_touch_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response =
from_wire_cache_touch_response(self.inner.touch(tonic_request).await?.into_inner());
Ok(response.touched)
}
pub async fn touch_raw(
&mut self,
request: CacheTouchRequest,
) -> Result<CacheTouchResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_cache_touch_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.touch(tonic_request).await?;
Ok(from_wire_cache_touch_response(response.into_inner()))
}
}