use std::time::Duration;
use libipld::Cid;
use serde::{Deserialize, Deserializer, Serialize};
use ax_aql::{Query, StaticQuery};
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct PrefetchRequest {
#[serde(deserialize_with = "deser_prefetch")]
pub query: Query<'static>,
pub duration: Duration,
}
fn deser_prefetch<'de, D: Deserializer<'de>>(d: D) -> Result<Query<'static>, D::Error> {
Ok(StaticQuery::deserialize(d)?.0)
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DirectoryChild {
pub size: u64,
pub name: String,
#[serde(with = "serde_str")]
pub cid: Cid,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub enum FilesGetResponse {
File {
name: String,
bytes: Vec<u8>,
mime: String,
},
Directory {
name: String,
#[serde(with = "serde_str")]
cid: Cid,
children: Vec<DirectoryChild>,
},
}
mod serde_str {
use std::{fmt::Display, str::FromStr};
use serde::{de, Deserialize, Deserializer, Serializer};
pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
T: Display,
S: Serializer,
{
serializer.collect_str(value)
}
pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: FromStr,
T::Err: Display,
D: Deserializer<'de>,
{
String::deserialize(deserializer)?.parse().map_err(de::Error::custom)
}
}