Skip to main content

millipede_core/crawler/
start.rs

1//! Start-request conversions accepted by crawlers.
2
3use crate::{errors::CrawlError, request::Request};
4
5/// A single value convertible into one start [`Request`].
6pub trait IntoStartRequest {
7    /// Converts this value into a request.
8    fn into_start_request(self) -> Result<Request, CrawlError>;
9}
10
11impl IntoStartRequest for Request {
12    fn into_start_request(self) -> Result<Request, CrawlError> {
13        Ok(self)
14    }
15}
16
17impl IntoStartRequest for url::Url {
18    fn into_start_request(self) -> Result<Request, CrawlError> {
19        Ok(Request::get(self).build()?)
20    }
21}
22
23impl IntoStartRequest for &str {
24    fn into_start_request(self) -> Result<Request, CrawlError> {
25        Ok(Request::get(self).build()?)
26    }
27}
28
29impl IntoStartRequest for String {
30    fn into_start_request(self) -> Result<Request, CrawlError> {
31        Ok(Request::get(self).build()?)
32    }
33}
34
35/// A collection of start requests accepted by [`super::Crawler::run`].
36pub trait IntoStartRequests {
37    /// Converts this value into an owned list of requests.
38    fn into_start_requests(self) -> Result<Vec<Request>, CrawlError>;
39}
40
41macro_rules! impl_single_start_requests {
42    ($($ty:ty),+ $(,)?) => {$(
43        impl IntoStartRequests for $ty {
44            fn into_start_requests(self) -> Result<Vec<Request>, CrawlError> {
45                Ok(vec![self.into_start_request()?])
46            }
47        }
48    )+};
49}
50
51impl_single_start_requests!(Request, url::Url, &str, String);
52
53impl<T: IntoStartRequest> IntoStartRequests for Vec<T> {
54    fn into_start_requests(self) -> Result<Vec<Request>, CrawlError> {
55        self.into_iter()
56            .map(IntoStartRequest::into_start_request)
57            .collect()
58    }
59}
60
61impl<T: IntoStartRequest, const N: usize> IntoStartRequests for [T; N] {
62    fn into_start_requests(self) -> Result<Vec<Request>, CrawlError> {
63        self.into_iter()
64            .map(IntoStartRequest::into_start_request)
65            .collect()
66    }
67}
68
69impl<T: IntoStartRequest + Clone> IntoStartRequests for &[T] {
70    fn into_start_requests(self) -> Result<Vec<Request>, CrawlError> {
71        self.iter()
72            .cloned()
73            .map(IntoStartRequest::into_start_request)
74            .collect()
75    }
76}