use bytes::Bytes;
use super::meta::RequestMeta;
use crate::crawler::{Attempt, Depth, Tag};
use crate::identity::Identity;
pub type Request<B = Bytes> = ::http::Request<B>;
pub trait RequestExt {
fn tag(&self) -> Option<&Tag>;
fn depth(&self) -> Depth;
fn attempt(&self) -> Attempt;
fn identity(&self) -> Option<&Identity>;
}
impl<B> RequestExt for ::http::Request<B> {
fn tag(&self) -> Option<&Tag> {
self.extensions().get::<RequestMeta>()?.tag.as_ref()
}
fn depth(&self) -> Depth {
self.extensions()
.get::<RequestMeta>()
.map(|meta| meta.depth)
.unwrap_or_default()
}
fn attempt(&self) -> Attempt {
self.extensions()
.get::<RequestMeta>()
.map(|meta| meta.attempt)
.unwrap_or_default()
}
fn identity(&self) -> Option<&Identity> {
self.extensions().get::<RequestMeta>()?.identity.as_ref()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn request_metadata_defaults() {
let request = Request::new(());
assert_eq!(request.tag(), None);
assert_eq!(request.depth(), Depth::ROOT);
assert_eq!(request.attempt(), Attempt::FIRST);
}
#[test]
fn request_metadata_from_extensions() {
let mut request = Request::new(());
request.extensions_mut().insert(RequestMeta {
tag: Some(Tag::from_static("page")),
depth: Depth::new(2),
attempt: Attempt::FIRST,
identity: None,
});
assert_eq!(request.tag(), Some(&Tag::from("page")));
assert_eq!(request.depth().child(), Depth::new(3));
}
}