progscrape_scrapers/backends/
feed.rs1use std::borrow::Cow;
2
3use itertools::Itertools;
4use serde::{Deserialize, Serialize};
5
6use crate::{ScrapeCore, ScrapeSource};
7
8use super::{
9 GenericScrape, ScrapeConfigSource, ScrapeSourceDef, ScrapeStory, Scraper, scrape_story,
10};
11
12pub struct Feed {}
13
14impl ScrapeSourceDef for Feed {
15 type Config = FeedConfig;
16 type Scrape = FeedStory;
17 type Scraper = FeedScraper;
18
19 fn comments_url(_id: &str, _subsource: Option<&str>) -> String {
20 "".to_string()
21 }
22
23 fn id_from_comments_url(_url: &str) -> Option<(&str, Option<&str>)> {
24 None
25 }
26
27 fn is_comments_host(_host: &str) -> bool {
28 false
29 }
30}
31
32#[derive(Clone, Default, Serialize, Deserialize)]
33pub struct FeedConfig {}
34
35impl ScrapeConfigSource for FeedConfig {
36 fn provide_urls(&self, _subsources: Vec<String>) -> Vec<String> {
37 vec![]
38 }
39
40 fn subsources(&self) -> Vec<String> {
41 vec![]
42 }
43}
44
45scrape_story! {
46 FeedStory {
47 tags: Vec<String>
48 }
49}
50
51impl ScrapeStory for FeedStory {
52 const TYPE: ScrapeSource = ScrapeSource::Feed;
53
54 fn merge(&mut self, _other: Self) {}
55}
56
57#[derive(Default)]
58pub struct FeedScraper {}
59
60impl Scraper for FeedScraper {
61 type Config = <Feed as ScrapeSourceDef>::Config;
62 type Output = <Feed as ScrapeSourceDef>::Scrape;
63
64 fn extract_core<'a>(
65 &self,
66 args: &Self::Config,
67 input: &'a super::GenericScrape<Self::Output>,
68 ) -> ScrapeCore<'a> {
69 let tags = input
70 .data
71 .tags
72 .iter()
73 .map(|tag| Cow::Borrowed(tag.as_str()))
74 .collect_vec();
75 ScrapeCore {
76 source: &input.shared.id,
77 title: Cow::Borrowed(&input.shared.raw_title),
78 url: &input.shared.url,
79 date: input.shared.date,
80 rank: None,
81 tags,
82 }
83 }
84
85 fn scrape(
86 &self,
87 _args: &Self::Config,
88 _input: &str,
89 ) -> Result<(Vec<super::GenericScrape<Self::Output>>, Vec<String>), crate::ScrapeError> {
90 unimplemented!()
91 }
92}