use crate::framework::endpoint::{serialize_query, EndpointSpec, MultipartBody, MultipartPart};
use crate::framework::endpoint::{Method, RequestBody};
use crate::framework::response::ApiSuccess;
use serde::Serialize;
use std::borrow::Cow;
#[derive(Debug)]
pub struct WriteKey<'a> {
pub account_identifier: &'a str,
pub namespace_identifier: &'a str,
pub key: &'a str,
pub params: WriteKeyParams,
pub body: WriteKeyBody,
}
impl EndpointSpec for WriteKey<'_> {
type JsonResponse = ();
type ResponseType = ApiSuccess<Self::JsonResponse>;
fn method(&self) -> Method {
Method::PUT
}
fn path(&self) -> String {
format!(
"accounts/{}/storage/kv/namespaces/{}/values/{}",
self.account_identifier,
self.namespace_identifier,
super::url_encode_key(self.key)
)
}
#[inline]
fn query(&self) -> Option<String> {
serialize_query(&self.params)
}
#[inline]
fn body(&self) -> Option<RequestBody> {
match &self.body {
WriteKeyBody::Value(value) => Some(RequestBody::Raw(value.clone())),
WriteKeyBody::Metadata(metadata) => Some(RequestBody::MultiPart(metadata)),
}
}
fn content_type(&self) -> Option<Cow<'static, str>> {
match &self.body {
WriteKeyBody::Value(_) => Some(Cow::Borrowed("application/octet-stream")),
WriteKeyBody::Metadata(_) => Some(Cow::Borrowed("multipart/form-data")),
}
}
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug, Default)]
pub struct WriteKeyParams {
pub expiration: Option<i64>,
pub expiration_ttl: Option<i64>,
}
#[derive(Serialize, Clone, Debug)]
pub struct WriteKeyBodyMetadata {
pub value: Vec<u8>,
pub metadata: serde_json::Value,
}
impl MultipartBody for WriteKeyBodyMetadata {
fn parts(&self) -> Vec<(String, MultipartPart)> {
vec![
(
"metadata".to_string(),
MultipartPart::Text(
serde_json::to_string(&self.metadata).expect("Failed to serialize metadata"),
),
),
(
"value".to_string(),
MultipartPart::Bytes(self.value.clone()),
),
]
}
}
#[derive(Serialize, Clone, Debug)]
pub enum WriteKeyBody {
Value(Vec<u8>),
Metadata(WriteKeyBodyMetadata),
}