use std::{fmt, str::FromStr}; use serde::{de, Deserialize, Deserializer}; pub mod company; pub mod in_process_transaction; pub mod transaction; /// Struct to deserialize paginated routes query parameters #[derive(Deserialize)] pub struct Pagination { #[serde(default, deserialize_with = "empty_string_as_none")] pub page: Option, #[serde(default, deserialize_with = "empty_string_as_none")] pub size: Option, } /// Struct to deserialize a company slug as a query parameters #[derive(Deserialize)] pub struct CompanySlug { #[serde(default, deserialize_with = "empty_string_as_none")] pub company_slug: Option, } /// Struct to deserialize a limit as a query parameters #[derive(Deserialize)] pub struct Limit { #[serde(default, deserialize_with = "empty_string_as_none")] pub limit: Option, } fn empty_string_as_none<'de, D, T>(de: D) -> Result, D::Error> where D: Deserializer<'de>, T: FromStr, T::Err: fmt::Display, { let opt = Option::::deserialize(de)?; match opt.as_deref() { None | Some("") => Ok(None), Some(s) => FromStr::from_str(s).map_err(de::Error::custom).map(Some), } }