Add source

This commit is contained in:
Gabriel Simmer 2023-08-27 22:06:45 +01:00
parent 30f6673c89
commit 1916ea0efe
Signed by: arch
SSH key fingerprint: SHA256:m3OEcdtrnBpMX+2BDGh/byv3hrCekCLzDYMdvGEKPPQ
2 changed files with 101 additions and 0 deletions

82
src/lib.rs Normal file
View file

@ -0,0 +1,82 @@
use reqwest::{Error as ReqwestError, StatusCode};
use rss::{Channel, Error as RssError};
use regex::Regex;
use std::io::Cursor;
use worker::{Request, Env, Response, Router, event, Headers};
#[derive(Debug)]
enum CustomError {
Reqwest(ReqwestError),
Rss(RssError),
}
impl From<ReqwestError> for CustomError {
fn from(error: ReqwestError) -> Self {
CustomError::Reqwest(error)
}
}
impl From<RssError> for CustomError {
fn from(error: RssError) -> Self {
CustomError::Rss(error)
}
}
#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> worker::Result<Response>{
let router = Router::new();
router
.get_async("/", |_, ctx| async move {
let rss = match fetch_modified_rss().await {
Ok(r) => r,
Err(e) => "".to_owned(),
};
let res = Response::from_bytes(rss.into()).unwrap();
let mut headers = Headers::new();
headers.set("content-type", "application/rss+xml");
Ok(res.with_headers(headers))
}).run(req, env).await
}
async fn fetch_modified_rss() -> Result<String, CustomError> {
let url = "https://news.ycombinator.com/rss";
let resp = reqwest::get(url).await?;
let body = resp.text().await?;
let cursor = Cursor::new(body);
let channel = match Channel::read_from(cursor) {
Ok(channel) => channel,
Err(RssError::InvalidStartTag) => {
eprintln!("Invalid start tag found in the feed. Please check the feed URL or try again later.");
return Ok(String::new());
},
Err(err) => return Err(err.into()),
};
let items = channel.into_items();
let updated_items = items
.iter()
.map(|item| {
let mut new_item = item.clone();
let description = item.description().unwrap_or_default();
let new_description = remove_comment_link(description);
new_item.set_description(new_description);
new_item
})
.collect::<Vec<_>>();
let mut modified_rss = Channel::default();
modified_rss.set_items(updated_items);
Ok(modified_rss.to_string())
}
fn remove_comment_link(description: &str) -> String {
let re = Regex::new(r"(?i)<a[^>]*>comments</a>").unwrap();
re.replace(description, "").to_string()
}

19
wrangler.toml Normal file
View file

@ -0,0 +1,19 @@
name = "hn-rss"
type = "javascript"
workers_dev = true
compatibility_date = "2022-01-20"
[vars]
WORKERS_RS_VERSION = "0.0.18"
[build]
command = "cargo install -q worker-build && worker-build --release" # required
[build.upload]
dir = "build/worker"
format = "modules"
main = "./shim.mjs"
[[build.upload.rules]]
globs = ["**/*.wasm"]
type = "CompiledWasm"