use serde::{Deserialize, Deserializer};
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Paginated<T> {
pub items: Vec<T>,
#[serde(rename = "_metadata")]
pub metadata: PaginatedMetadata,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PaginatedMetadata {
pub total_pages: u64,
}
pub struct Empty;
impl<'de> Deserialize<'de> for Empty {
fn deserialize<D>(_: D) -> Result<Empty, D::Error>
where
D: Deserializer<'de>,
{
Ok(Empty)
}
}
pub mod nested_json {
use std::fmt;
use serde::de::{Error, Visitor};
use serde::Deserializer;
pub fn deserialize<'de, D>(deserializer: D) -> Result<serde_json::Value, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Default)]
struct NestedJson;
impl Visitor<'_> for NestedJson {
type Value = serde_json::Value;
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "valid nested json object")
}
fn visit_unit<E>(self) -> Result<serde_json::Value, E>
where
E: Error,
{
Ok(serde_json::Value::Null)
}
fn visit_str<E>(self, value: &str) -> Result<serde_json::Value, E>
where
E: Error,
{
serde_json::from_str(value).map_err(Error::custom)
}
}
deserializer.deserialize_any(NestedJson)
}
}
pub fn empty_json_object() -> serde_json::Value {
serde_json::Value::Object(serde_json::Map::new())
}