1use crate::codec::cache::{
6 from_wire_cache_delete_many_response, from_wire_cache_delete_response,
7 from_wire_cache_get_many_response, from_wire_cache_get_response,
8 from_wire_cache_touch_response, to_wire_cache_delete_many_request,
9 to_wire_cache_delete_request, to_wire_cache_get_many_request, to_wire_cache_get_request,
10 to_wire_cache_set_many_request, to_wire_cache_set_request, to_wire_cache_touch_request,
11};
12use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
13use crate::generated::v1;
14use crate::rpc_support::GestaltError;
15
16#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct CacheDeleteManyRequest {
22 pub keys: Vec<String>,
24}
25
26#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
30#[serde(rename_all = "camelCase")]
31pub struct CacheDeleteManyResponse {
32 pub deleted: i64,
34}
35
36#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
40#[serde(rename_all = "camelCase")]
41pub struct CacheDeleteRequest {
42 pub key: String,
44}
45
46#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
50#[serde(rename_all = "camelCase")]
51pub struct CacheDeleteResponse {
52 pub deleted: bool,
54}
55
56#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
60#[serde(rename_all = "camelCase")]
61pub struct CacheGetManyRequest {
62 pub keys: Vec<String>,
64}
65
66#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
70#[serde(rename_all = "camelCase")]
71pub struct CacheGetManyResponse {
72 pub entries: Vec<CacheResult>,
74}
75
76#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
80#[serde(rename_all = "camelCase")]
81pub struct CacheGetRequest {
82 pub key: String,
84}
85
86#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct CacheGetResponse {
92 pub found: bool,
94 pub value: Vec<u8>,
96}
97
98#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
102#[serde(rename_all = "camelCase")]
103pub struct CacheResult {
104 pub key: String,
106 pub found: bool,
108 pub value: Vec<u8>,
110}
111
112#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
116#[serde(rename_all = "camelCase")]
117pub struct CacheSetEntry {
118 pub key: String,
120 pub value: Vec<u8>,
122}
123
124#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
128#[serde(rename_all = "camelCase")]
129pub struct CacheSetManyRequest {
130 pub entries: Vec<CacheSetEntry>,
132 #[serde(with = "crate::serde_duration")]
133 pub ttl: Option<std::time::Duration>,
135}
136
137#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
141#[serde(rename_all = "camelCase")]
142pub struct CacheSetRequest {
143 pub key: String,
145 pub value: Vec<u8>,
147 #[serde(with = "crate::serde_duration")]
150 pub ttl: Option<std::time::Duration>,
152}
153
154#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
158#[serde(rename_all = "camelCase")]
159pub struct CacheTouchRequest {
160 pub key: String,
162 #[serde(with = "crate::serde_duration")]
163 pub ttl: Option<std::time::Duration>,
165}
166
167#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
171#[serde(rename_all = "camelCase")]
172pub struct CacheTouchResponse {
173 pub touched: bool,
175}
176
177pub struct Cache {
181 inner: v1::cache_client::CacheClient<HostServiceChannel>,
182 timeout: Option<std::time::Duration>,
183}
184
185impl Cache {
186 pub fn new(channel: tonic::transport::Channel) -> Self {
188 Self {
189 inner: v1::cache_client::CacheClient::new(plain_channel(channel)),
190 timeout: None,
191 }
192 }
193
194 pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
197 self.timeout = Some(timeout);
198 self
199 }
200
201 pub async fn connect() -> Result<Self, GestaltError> {
203 Self::connect_named("").await
204 }
205
206 pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
208 Ok(Self {
209 inner: v1::cache_client::CacheClient::new(connect_host_service("cache", name).await?),
210 timeout: None,
211 })
212 }
213
214 pub async fn get(&mut self, key: String) -> Result<Option<Vec<u8>>, GestaltError> {
216 let request = CacheGetRequest { key };
217 let mut tonic_request = tonic::Request::new(to_wire_cache_get_request(request));
218 if let Some(timeout) = self.timeout {
219 tonic_request.set_timeout(timeout);
220 }
221 let response =
222 from_wire_cache_get_response(self.inner.get(tonic_request).await?.into_inner());
223 if !response.found {
224 return Ok(None);
225 }
226 Ok(Some(response.value))
227 }
228
229 pub async fn get_raw(
231 &mut self,
232 request: CacheGetRequest,
233 ) -> Result<CacheGetResponse, GestaltError> {
234 let mut tonic_request = tonic::Request::new(to_wire_cache_get_request(request));
235 if let Some(timeout) = self.timeout {
236 tonic_request.set_timeout(timeout);
237 }
238 let response = self.inner.get(tonic_request).await?;
239 Ok(from_wire_cache_get_response(response.into_inner()))
240 }
241
242 pub async fn get_many(
244 &mut self,
245 keys: Vec<String>,
246 ) -> Result<std::collections::BTreeMap<String, Vec<u8>>, GestaltError> {
247 let request = CacheGetManyRequest { keys };
248 let mut tonic_request = tonic::Request::new(to_wire_cache_get_many_request(request));
249 if let Some(timeout) = self.timeout {
250 tonic_request.set_timeout(timeout);
251 }
252 let response = from_wire_cache_get_many_response(
253 self.inner.get_many(tonic_request).await?.into_inner(),
254 );
255 let mut out = std::collections::BTreeMap::new();
256 for entry in response.entries {
257 if entry.found {
258 out.insert(entry.key, entry.value);
259 }
260 }
261 Ok(out)
262 }
263
264 pub async fn get_many_raw(
266 &mut self,
267 request: CacheGetManyRequest,
268 ) -> Result<CacheGetManyResponse, GestaltError> {
269 let mut tonic_request = tonic::Request::new(to_wire_cache_get_many_request(request));
270 if let Some(timeout) = self.timeout {
271 tonic_request.set_timeout(timeout);
272 }
273 let response = self.inner.get_many(tonic_request).await?;
274 Ok(from_wire_cache_get_many_response(response.into_inner()))
275 }
276
277 pub async fn set(
279 &mut self,
280 key: String,
281 value: Vec<u8>,
282 ttl: Option<std::time::Duration>,
283 ) -> Result<(), GestaltError> {
284 let request = CacheSetRequest { key, value, ttl };
285 let mut tonic_request = tonic::Request::new(to_wire_cache_set_request(request));
286 if let Some(timeout) = self.timeout {
287 tonic_request.set_timeout(timeout);
288 }
289 self.inner.set(tonic_request).await?;
290 Ok(())
291 }
292
293 pub async fn set_raw(&mut self, request: CacheSetRequest) -> Result<(), GestaltError> {
295 let mut tonic_request = tonic::Request::new(to_wire_cache_set_request(request));
296 if let Some(timeout) = self.timeout {
297 tonic_request.set_timeout(timeout);
298 }
299 self.inner.set(tonic_request).await?;
300 Ok(())
301 }
302
303 pub async fn set_many(
305 &mut self,
306 entries: Vec<CacheSetEntry>,
307 ttl: Option<std::time::Duration>,
308 ) -> Result<(), GestaltError> {
309 let request = CacheSetManyRequest { entries, ttl };
310 let mut tonic_request = tonic::Request::new(to_wire_cache_set_many_request(request));
311 if let Some(timeout) = self.timeout {
312 tonic_request.set_timeout(timeout);
313 }
314 self.inner.set_many(tonic_request).await?;
315 Ok(())
316 }
317
318 pub async fn set_many_raw(&mut self, request: CacheSetManyRequest) -> Result<(), GestaltError> {
320 let mut tonic_request = tonic::Request::new(to_wire_cache_set_many_request(request));
321 if let Some(timeout) = self.timeout {
322 tonic_request.set_timeout(timeout);
323 }
324 self.inner.set_many(tonic_request).await?;
325 Ok(())
326 }
327
328 pub async fn delete(&mut self, key: String) -> Result<bool, GestaltError> {
330 let request = CacheDeleteRequest { key };
331 let mut tonic_request = tonic::Request::new(to_wire_cache_delete_request(request));
332 if let Some(timeout) = self.timeout {
333 tonic_request.set_timeout(timeout);
334 }
335 let response =
336 from_wire_cache_delete_response(self.inner.delete(tonic_request).await?.into_inner());
337 Ok(response.deleted)
338 }
339
340 pub async fn delete_raw(
342 &mut self,
343 request: CacheDeleteRequest,
344 ) -> Result<CacheDeleteResponse, GestaltError> {
345 let mut tonic_request = tonic::Request::new(to_wire_cache_delete_request(request));
346 if let Some(timeout) = self.timeout {
347 tonic_request.set_timeout(timeout);
348 }
349 let response = self.inner.delete(tonic_request).await?;
350 Ok(from_wire_cache_delete_response(response.into_inner()))
351 }
352
353 pub async fn delete_many(&mut self, keys: Vec<String>) -> Result<i64, GestaltError> {
355 let request = CacheDeleteManyRequest { keys };
356 let mut tonic_request = tonic::Request::new(to_wire_cache_delete_many_request(request));
357 if let Some(timeout) = self.timeout {
358 tonic_request.set_timeout(timeout);
359 }
360 let response = from_wire_cache_delete_many_response(
361 self.inner.delete_many(tonic_request).await?.into_inner(),
362 );
363 Ok(response.deleted)
364 }
365
366 pub async fn delete_many_raw(
368 &mut self,
369 request: CacheDeleteManyRequest,
370 ) -> Result<CacheDeleteManyResponse, GestaltError> {
371 let mut tonic_request = tonic::Request::new(to_wire_cache_delete_many_request(request));
372 if let Some(timeout) = self.timeout {
373 tonic_request.set_timeout(timeout);
374 }
375 let response = self.inner.delete_many(tonic_request).await?;
376 Ok(from_wire_cache_delete_many_response(response.into_inner()))
377 }
378
379 pub async fn touch(
381 &mut self,
382 key: String,
383 ttl: Option<std::time::Duration>,
384 ) -> Result<bool, GestaltError> {
385 let request = CacheTouchRequest { key, ttl };
386 let mut tonic_request = tonic::Request::new(to_wire_cache_touch_request(request));
387 if let Some(timeout) = self.timeout {
388 tonic_request.set_timeout(timeout);
389 }
390 let response =
391 from_wire_cache_touch_response(self.inner.touch(tonic_request).await?.into_inner());
392 Ok(response.touched)
393 }
394
395 pub async fn touch_raw(
397 &mut self,
398 request: CacheTouchRequest,
399 ) -> Result<CacheTouchResponse, GestaltError> {
400 let mut tonic_request = tonic::Request::new(to_wire_cache_touch_request(request));
401 if let Some(timeout) = self.timeout {
402 tonic_request.set_timeout(timeout);
403 }
404 let response = self.inner.touch(tonic_request).await?;
405 Ok(from_wire_cache_touch_response(response.into_inner()))
406 }
407}