Skip to main content

nexus_common/types/
pagination.rs

1use 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
17// Parse a string into a usize
18fn 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
29// Parsing strings or floats into f64
30fn 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}