gestalt/
cache_provider.rs1use std::collections::{BTreeMap, BTreeSet};
2use std::time::Duration;
3
4use tonic::codegen::async_trait;
5
6use crate::api::RuntimeMetadata;
7use crate::error::Result;
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub struct CacheEntry {
12 pub key: String,
14 pub value: Vec<u8>,
16}
17
18#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
19pub struct CacheSetOptions {
21 pub ttl: Option<Duration>,
23}
24
25#[async_trait]
26pub trait CacheProvider: Send + Sync + 'static {
28 async fn configure(
30 &self,
31 _name: &str,
32 _config: serde_json::Map<String, serde_json::Value>,
33 ) -> Result<()> {
34 Ok(())
35 }
36
37 fn metadata(&self) -> Option<RuntimeMetadata> {
39 None
40 }
41
42 fn warnings(&self) -> Vec<String> {
44 Vec::new()
45 }
46
47 async fn health_check(&self) -> Result<()> {
49 Ok(())
50 }
51
52 async fn start(&self) -> Result<()> {
54 Ok(())
55 }
56
57 async fn close(&self) -> Result<()> {
59 Ok(())
60 }
61
62 async fn get(&self, key: &str) -> Result<Option<Vec<u8>>>;
64
65 async fn get_many(&self, keys: &[String]) -> Result<BTreeMap<String, Vec<u8>>> {
68 let mut values = BTreeMap::new();
69 for key in keys {
70 if let Some(value) = self.get(key).await? {
71 values.insert(key.clone(), value);
72 }
73 }
74 Ok(values)
75 }
76
77 async fn set(&self, key: &str, value: &[u8], options: CacheSetOptions) -> Result<()>;
79
80 async fn set_many(&self, entries: &[CacheEntry], options: CacheSetOptions) -> Result<()> {
83 for entry in entries {
84 self.set(&entry.key, &entry.value, options).await?;
85 }
86 Ok(())
87 }
88
89 async fn delete(&self, key: &str) -> Result<bool>;
91
92 async fn delete_many(&self, keys: &[String]) -> Result<i64> {
95 let mut deleted = 0_i64;
96 let mut seen = BTreeSet::new();
97 for key in keys {
98 if !seen.insert(key.as_str()) {
99 continue;
100 }
101 if self.delete(key).await? {
102 deleted += 1;
103 }
104 }
105 Ok(deleted)
106 }
107
108 async fn touch(&self, key: &str, ttl: Duration) -> Result<bool>;
110}