millipede_core/
handler.rs1use std::future::Future;
4use std::sync::Arc;
5
6use futures_util::future::BoxFuture;
7
8use crate::errors::CrawlError;
9use crate::request::Request;
10
11pub trait RequestHandler<C>: Send + Sync + 'static {
13 fn handle(&self, ctx: C) -> BoxFuture<'static, Result<(), CrawlError>>;
15}
16
17impl<C, F, Fut> RequestHandler<C> for F
18where
19 F: Fn(C) -> Fut + Send + Sync + 'static,
20 Fut: Future<Output = Result<(), CrawlError>> + Send + 'static,
21{
22 fn handle(&self, ctx: C) -> BoxFuture<'static, Result<(), CrawlError>> {
23 Box::pin((self)(ctx))
24 }
25}
26
27pub trait Middleware<C>: Send + Sync + 'static {
29 fn run(&self, ctx: C) -> BoxFuture<'static, Result<C, CrawlError>>;
32}
33
34impl<C, F, Fut> Middleware<C> for F
35where
36 F: Fn(C) -> Fut + Send + Sync + 'static,
37 Fut: Future<Output = Result<C, CrawlError>> + Send + 'static,
38{
39 fn run(&self, ctx: C) -> BoxFuture<'static, Result<C, CrawlError>> {
40 Box::pin((self)(ctx))
41 }
42}
43
44#[derive(Debug, Clone)]
46#[non_exhaustive]
47pub struct FailedRequestContext {
48 pub request: Arc<Request>,
50 pub error: Arc<CrawlError>,
52 pub retry_count: u32,
54}
55
56impl FailedRequestContext {
57 pub fn new(request: Arc<Request>, error: Arc<CrawlError>, retry_count: u32) -> Self {
59 Self {
60 request,
61 error,
62 retry_count,
63 }
64 }
65}
66
67pub trait FailedRequestHandler: Send + Sync + 'static {
69 fn handle(&self, ctx: FailedRequestContext) -> BoxFuture<'static, Result<(), CrawlError>>;
71}
72
73impl<F, Fut> FailedRequestHandler for F
74where
75 F: Fn(FailedRequestContext) -> Fut + Send + Sync + 'static,
76 Fut: Future<Output = Result<(), CrawlError>> + Send + 'static,
77{
78 fn handle(&self, ctx: FailedRequestContext) -> BoxFuture<'static, Result<(), CrawlError>> {
79 Box::pin((self)(ctx))
80 }
81}