Add source
This commit is contained in:
parent
30f6673c89
commit
1916ea0efe
82
src/lib.rs
Normal file
82
src/lib.rs
Normal 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
19
wrangler.toml
Normal 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"
|
Loading…
Reference in a new issue