cloudflare/endpoints/workerskv/
mod.rs

1use crate::framework::ApiResultTraits;
2use chrono::DateTime;
3use chrono::{TimeZone, Utc};
4use percent_encoding::{percent_encode, PATH_SEGMENT_ENCODE_SET};
5use serde::{Deserialize, Deserializer};
6
7pub mod create_namespace;
8pub mod delete_bulk;
9pub mod delete_key;
10pub mod list_namespace_keys;
11pub mod list_namespaces;
12pub mod remove_namespace;
13pub mod rename_namespace;
14pub mod write_bulk;
15
16/// Workers KV Namespace
17/// A Namespace is a collection of key-value pairs stored in Workers KV.
18/// https://api.cloudflare.com/#workers-kv-namespace-properties
19#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
20pub struct WorkersKvNamespace {
21    /// Namespace identifier tag.
22    pub id: String,
23    /// A human-readable string name for a Namespace.
24    pub title: String,
25}
26
27impl ApiResultTraits for WorkersKvNamespace {}
28
29impl ApiResultTraits for Vec<WorkersKvNamespace> {}
30
31#[serde_with::skip_serializing_none]
32#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq)]
33pub struct Key {
34    pub name: String,
35    #[serde(default)]
36    #[serde(deserialize_with = "deserialize_option_timestamp")]
37    pub expiration: Option<DateTime<Utc>>,
38}
39
40pub fn deserialize_option_timestamp<'de, D>(
41    deserializer: D,
42) -> Result<Option<DateTime<Utc>>, D::Error>
43where
44    D: Deserializer<'de>,
45{
46    let s: Option<i64> = Option::deserialize(deserializer)?;
47    if let Some(s) = s {
48        return Ok(Some(Utc.timestamp(s, 0)));
49    }
50
51    Ok(None)
52}
53
54impl ApiResultTraits for Key {}
55
56impl ApiResultTraits for Vec<Key> {}
57
58fn url_encode_key(key: &str) -> String {
59    percent_encode(key.as_bytes(), PATH_SEGMENT_ENCODE_SET).to_string()
60}