spider_core/engine/
context.rs1use crate::{Scheduler, spider::Spider, stats::StatCollector};
15use spider_pipeline::pipeline::Pipeline;
16use spider_util::item::ScrapedItem;
17use std::sync::Arc;
18
19pub struct CrawlerContextInner<S, I>
24where
25 S: Spider<Item = I>,
26 I: ScrapedItem,
27{
28 pub scheduler: Arc<Scheduler>,
29 pub stats: Arc<StatCollector>,
30 pub spider: Arc<S>,
31 pub spider_state: Arc<S::State>,
32 pub pipelines: Arc<Vec<Box<dyn Pipeline<I>>>>,
33}
34
35pub struct CrawlerContext<S, I>(pub Arc<CrawlerContextInner<S, I>>)
40where
41 S: Spider<Item = I>,
42 I: ScrapedItem;
43
44impl<S, I> Clone for CrawlerContext<S, I>
45where
46 S: Spider<Item = I>,
47 I: ScrapedItem,
48{
49 fn clone(&self) -> Self {
50 CrawlerContext(Arc::clone(&self.0))
51 }
52}
53
54impl<S, I> CrawlerContext<S, I>
55where
56 S: Spider<Item = I>,
57 I: ScrapedItem,
58{
59 pub fn new(
61 scheduler: Arc<Scheduler>,
62 stats: Arc<StatCollector>,
63 spider: Arc<S>,
64 spider_state: Arc<S::State>,
65 pipelines: Arc<Vec<Box<dyn Pipeline<I>>>>,
66 ) -> Self {
67 CrawlerContext(Arc::new(CrawlerContextInner {
68 scheduler,
69 stats,
70 spider,
71 spider_state,
72 pipelines,
73 }))
74 }
75
76 pub fn from_crawler(
78 scheduler: Arc<Scheduler>,
79 stats: Arc<StatCollector>,
80 spider: Arc<S>,
81 spider_state: Arc<S::State>,
82 pipelines: Arc<Vec<Box<dyn Pipeline<I>>>>,
83 ) -> Self {
84 Self::new(scheduler, stats, spider, spider_state, pipelines)
85 }
86}
87
88impl<S, I> std::ops::Deref for CrawlerContext<S, I>
90where
91 S: Spider<Item = I>,
92 I: ScrapedItem,
93{
94 type Target = CrawlerContextInner<S, I>;
95
96 fn deref(&self) -> &Self::Target {
97 &self.0
98 }
99}