nexus_common/types/
pagination.rs1use serde::de::{self, Deserializer};
2use serde::Deserialize;
3use utoipa::ToSchema;
4
5#[derive(Default, Deserialize, Debug, ToSchema, Clone)]
6pub struct Pagination {
7 #[serde(default, deserialize_with = "parse_string_to_usize")]
8 pub skip: Option<usize>,
9 #[serde(default, deserialize_with = "parse_string_to_usize")]
10 pub limit: Option<usize>,
11 #[serde(default, deserialize_with = "parse_string_to_f64")]
12 pub start: Option<f64>,
13 #[serde(default, deserialize_with = "parse_string_to_f64")]
14 pub end: Option<f64>,
15}
16
17fn parse_string_to_usize<'de, D>(deserializer: D) -> Result<Option<usize>, D::Error>
19where
20 D: Deserializer<'de>,
21{
22 let s: Option<String> = Option::deserialize(deserializer)?;
23 match s {
24 Some(s) => s.parse::<usize>().map(Some).map_err(de::Error::custom),
25 None => Ok(None),
26 }
27}
28
29fn parse_string_to_f64<'de, D>(deserializer: D) -> Result<Option<f64>, D::Error>
31where
32 D: Deserializer<'de>,
33{
34 let s: Option<String> = Option::deserialize(deserializer)?;
35 match s {
36 Some(s) => s.parse::<f64>().map(Some).map_err(de::Error::custom),
37 None => Ok(None),
38 }
39}