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)]
20pub struct CacheDeleteManyRequest {
21 pub keys: Vec<String>,
23}
24
25#[derive(Clone, Debug, Default, PartialEq)]
29pub struct CacheDeleteManyResponse {
30 pub deleted: i64,
32}
33
34#[derive(Clone, Debug, Default, PartialEq)]
38pub struct CacheDeleteRequest {
39 pub key: String,
41}
42
43#[derive(Clone, Debug, Default, PartialEq)]
47pub struct CacheDeleteResponse {
48 pub deleted: bool,
50}
51
52#[derive(Clone, Debug, Default, PartialEq)]
56pub struct CacheGetManyRequest {
57 pub keys: Vec<String>,
59}
60
61#[derive(Clone, Debug, Default, PartialEq)]
65pub struct CacheGetManyResponse {
66 pub entries: Vec<CacheResult>,
68}
69
70#[derive(Clone, Debug, Default, PartialEq)]
74pub struct CacheGetRequest {
75 pub key: String,
77}
78
79#[derive(Clone, Debug, Default, PartialEq)]
83pub struct CacheGetResponse {
84 pub found: bool,
86 pub value: Vec<u8>,
88}
89
90#[derive(Clone, Debug, Default, PartialEq)]
94pub struct CacheResult {
95 pub key: String,
97 pub found: bool,
99 pub value: Vec<u8>,
101}
102
103#[derive(Clone, Debug, Default, PartialEq)]
107pub struct CacheSetEntry {
108 pub key: String,
110 pub value: Vec<u8>,
112}
113
114#[derive(Clone, Debug, Default, PartialEq)]
118pub struct CacheSetManyRequest {
119 pub entries: Vec<CacheSetEntry>,
121 pub ttl: Option<std::time::Duration>,
123}
124
125#[derive(Clone, Debug, Default, PartialEq)]
129pub struct CacheSetRequest {
130 pub key: String,
132 pub value: Vec<u8>,
134 pub ttl: Option<std::time::Duration>,
138}
139
140#[derive(Clone, Debug, Default, PartialEq)]
144pub struct CacheTouchRequest {
145 pub key: String,
147 pub ttl: Option<std::time::Duration>,
149}
150
151#[derive(Clone, Debug, Default, PartialEq)]
155pub struct CacheTouchResponse {
156 pub touched: bool,
158}
159
160pub struct Cache {
164 inner: v1::cache_client::CacheClient<HostServiceChannel>,
165 timeout: Option<std::time::Duration>,
166}
167
168impl Cache {
169 pub fn new(channel: tonic::transport::Channel) -> Self {
171 Self {
172 inner: v1::cache_client::CacheClient::new(plain_channel(channel)),
173 timeout: None,
174 }
175 }
176
177 pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
180 self.timeout = Some(timeout);
181 self
182 }
183
184 pub async fn connect() -> Result<Self, GestaltError> {
186 Self::connect_named("").await
187 }
188
189 pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
191 Ok(Self {
192 inner: v1::cache_client::CacheClient::new(connect_host_service("cache", name).await?),
193 timeout: None,
194 })
195 }
196
197 pub async fn get(&mut self, key: String) -> Result<Option<Vec<u8>>, GestaltError> {
199 let request = CacheGetRequest { key };
200 let mut tonic_request = tonic::Request::new(to_wire_cache_get_request(request));
201 if let Some(timeout) = self.timeout {
202 tonic_request.set_timeout(timeout);
203 }
204 let response =
205 from_wire_cache_get_response(self.inner.get(tonic_request).await?.into_inner());
206 if !response.found {
207 return Ok(None);
208 }
209 Ok(Some(response.value))
210 }
211
212 pub async fn get_raw(
214 &mut self,
215 request: CacheGetRequest,
216 ) -> Result<CacheGetResponse, GestaltError> {
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 = self.inner.get(tonic_request).await?;
222 Ok(from_wire_cache_get_response(response.into_inner()))
223 }
224
225 pub async fn get_many(
227 &mut self,
228 keys: Vec<String>,
229 ) -> Result<std::collections::BTreeMap<String, Vec<u8>>, GestaltError> {
230 let request = CacheGetManyRequest { keys };
231 let mut tonic_request = tonic::Request::new(to_wire_cache_get_many_request(request));
232 if let Some(timeout) = self.timeout {
233 tonic_request.set_timeout(timeout);
234 }
235 let response = from_wire_cache_get_many_response(
236 self.inner.get_many(tonic_request).await?.into_inner(),
237 );
238 let mut out = std::collections::BTreeMap::new();
239 for entry in response.entries {
240 if entry.found {
241 out.insert(entry.key, entry.value);
242 }
243 }
244 Ok(out)
245 }
246
247 pub async fn get_many_raw(
249 &mut self,
250 request: CacheGetManyRequest,
251 ) -> Result<CacheGetManyResponse, GestaltError> {
252 let mut tonic_request = tonic::Request::new(to_wire_cache_get_many_request(request));
253 if let Some(timeout) = self.timeout {
254 tonic_request.set_timeout(timeout);
255 }
256 let response = self.inner.get_many(tonic_request).await?;
257 Ok(from_wire_cache_get_many_response(response.into_inner()))
258 }
259
260 pub async fn set(
262 &mut self,
263 key: String,
264 value: Vec<u8>,
265 ttl: Option<std::time::Duration>,
266 ) -> Result<(), GestaltError> {
267 let request = CacheSetRequest { key, value, ttl };
268 let mut tonic_request = tonic::Request::new(to_wire_cache_set_request(request));
269 if let Some(timeout) = self.timeout {
270 tonic_request.set_timeout(timeout);
271 }
272 self.inner.set(tonic_request).await?;
273 Ok(())
274 }
275
276 pub async fn set_raw(&mut self, request: CacheSetRequest) -> Result<(), GestaltError> {
278 let mut tonic_request = tonic::Request::new(to_wire_cache_set_request(request));
279 if let Some(timeout) = self.timeout {
280 tonic_request.set_timeout(timeout);
281 }
282 self.inner.set(tonic_request).await?;
283 Ok(())
284 }
285
286 pub async fn set_many(
288 &mut self,
289 entries: Vec<CacheSetEntry>,
290 ttl: Option<std::time::Duration>,
291 ) -> Result<(), GestaltError> {
292 let request = CacheSetManyRequest { entries, ttl };
293 let mut tonic_request = tonic::Request::new(to_wire_cache_set_many_request(request));
294 if let Some(timeout) = self.timeout {
295 tonic_request.set_timeout(timeout);
296 }
297 self.inner.set_many(tonic_request).await?;
298 Ok(())
299 }
300
301 pub async fn set_many_raw(&mut self, request: CacheSetManyRequest) -> Result<(), GestaltError> {
303 let mut tonic_request = tonic::Request::new(to_wire_cache_set_many_request(request));
304 if let Some(timeout) = self.timeout {
305 tonic_request.set_timeout(timeout);
306 }
307 self.inner.set_many(tonic_request).await?;
308 Ok(())
309 }
310
311 pub async fn delete(&mut self, key: String) -> Result<bool, GestaltError> {
313 let request = CacheDeleteRequest { key };
314 let mut tonic_request = tonic::Request::new(to_wire_cache_delete_request(request));
315 if let Some(timeout) = self.timeout {
316 tonic_request.set_timeout(timeout);
317 }
318 let response =
319 from_wire_cache_delete_response(self.inner.delete(tonic_request).await?.into_inner());
320 Ok(response.deleted)
321 }
322
323 pub async fn delete_raw(
325 &mut self,
326 request: CacheDeleteRequest,
327 ) -> Result<CacheDeleteResponse, GestaltError> {
328 let mut tonic_request = tonic::Request::new(to_wire_cache_delete_request(request));
329 if let Some(timeout) = self.timeout {
330 tonic_request.set_timeout(timeout);
331 }
332 let response = self.inner.delete(tonic_request).await?;
333 Ok(from_wire_cache_delete_response(response.into_inner()))
334 }
335
336 pub async fn delete_many(&mut self, keys: Vec<String>) -> Result<i64, GestaltError> {
338 let request = CacheDeleteManyRequest { keys };
339 let mut tonic_request = tonic::Request::new(to_wire_cache_delete_many_request(request));
340 if let Some(timeout) = self.timeout {
341 tonic_request.set_timeout(timeout);
342 }
343 let response = from_wire_cache_delete_many_response(
344 self.inner.delete_many(tonic_request).await?.into_inner(),
345 );
346 Ok(response.deleted)
347 }
348
349 pub async fn delete_many_raw(
351 &mut self,
352 request: CacheDeleteManyRequest,
353 ) -> Result<CacheDeleteManyResponse, GestaltError> {
354 let mut tonic_request = tonic::Request::new(to_wire_cache_delete_many_request(request));
355 if let Some(timeout) = self.timeout {
356 tonic_request.set_timeout(timeout);
357 }
358 let response = self.inner.delete_many(tonic_request).await?;
359 Ok(from_wire_cache_delete_many_response(response.into_inner()))
360 }
361
362 pub async fn touch(
364 &mut self,
365 key: String,
366 ttl: Option<std::time::Duration>,
367 ) -> Result<bool, GestaltError> {
368 let request = CacheTouchRequest { key, ttl };
369 let mut tonic_request = tonic::Request::new(to_wire_cache_touch_request(request));
370 if let Some(timeout) = self.timeout {
371 tonic_request.set_timeout(timeout);
372 }
373 let response =
374 from_wire_cache_touch_response(self.inner.touch(tonic_request).await?.into_inner());
375 Ok(response.touched)
376 }
377
378 pub async fn touch_raw(
380 &mut self,
381 request: CacheTouchRequest,
382 ) -> Result<CacheTouchResponse, GestaltError> {
383 let mut tonic_request = tonic::Request::new(to_wire_cache_touch_request(request));
384 if let Some(timeout) = self.timeout {
385 tonic_request.set_timeout(timeout);
386 }
387 let response = self.inner.touch(tonic_request).await?;
388 Ok(from_wire_cache_touch_response(response.into_inner()))
389 }
390}