cratefield_runtime_cloudflare/ports/
kv.rs1use async_trait::async_trait;
4use cratefield_core::{KeyValue, KvError};
5use std::time::Duration;
6use worker::KvStore;
7use worker::send::IntoSendFuture;
8
9pub struct KvStorePort(pub KvStore);
10
11#[async_trait]
12impl KeyValue for KvStorePort {
13 async fn get(&self, key: &str) -> Result<Option<String>, KvError> {
14 self.0
15 .get(key)
16 .text()
17 .into_send()
18 .await
19 .map_err(|err| KvError::Operation(err.to_string()))
20 }
21
22 async fn put(&self, key: &str, value: &str, ttl: Option<Duration>) -> Result<(), KvError> {
23 let mut builder = self
24 .0
25 .put(key, value)
26 .map_err(|err| KvError::Operation(err.to_string()))?;
27 if let Some(ttl) = ttl {
28 let secs = ttl.as_secs().max(1);
29 builder = builder.expiration_ttl(secs);
30 }
31 builder
32 .execute()
33 .into_send()
34 .await
35 .map_err(|err| KvError::Operation(err.to_string()))
36 }
37
38 async fn delete(&self, key: &str) -> Result<(), KvError> {
39 self.0
40 .delete(key)
41 .into_send()
42 .await
43 .map_err(|err| KvError::Operation(err.to_string()))
44 }
45}