scraper_trail/request/
params.rs1use 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}