Skip to main content

cratefield_runtime_cloudflare/ports/
kv.rs

1//! `KeyValue` over a Workers KV namespace.
2
3use 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}