Skip to main content

scraper_trail/request/
params.rs

1use chrono::{DateTime, Utc};
2
3use super::Request;
4
5#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
6pub enum ParseError {
7    #[error("Invalid URL")]
8    InvalidUrl { expected: &'static str },
9    #[error("Invalid body")]
10    InvalidBody { expected: &'static str },
11    #[error("Other")]
12    Other { message: &'static str },
13}
14
15impl ParseError {
16    #[must_use]
17    pub fn serde<E: serde::de::Error>(self, request: &Request<'_>) -> E {
18        match self {
19            Self::InvalidUrl { expected } => serde::de::Error::invalid_value(
20                serde::de::Unexpected::Str(request.url.as_str()),
21                &expected,
22            ),
23            Self::InvalidBody { expected } => serde::de::Error::invalid_value(
24                serde::de::Unexpected::Str(request.body.as_deref().unwrap_or_default()),
25                &expected,
26            ),
27            Self::Other { message } => serde::de::Error::custom(message),
28        }
29    }
30}
31
32pub trait Params: Sized {
33    fn build_request(&self, timestamp: Option<DateTime<Utc>>) -> Request<'_>;
34    fn parse_request(request: &Request<'_>) -> Result<Self, ParseError>;
35}