use std::time::{Duration, SystemTime, UNIX_EPOCH};
use github_trending_rs::{Language, Repository, Since, TrendExt, Trending};
pub async fn get_trending_rust_repo() -> anyhow::Result<Trending<Repository>> {
let client = reqwest::ClientBuilder::new()
.connect_timeout(Duration::from_secs(5))
.timeout(Duration::from_secs(10))
.build()?;
Ok(client
.github_trending()
.with_language(Language::Rust)
.since(Since::Daily)
.repositories()
.await?)
}
#[allow(clippy::let_and_return)]
pub fn escape_markdown_for_telegram(out: &str) -> String {
let out = out.replace("-", "\\-");
let out = out.replace("+", "\\+");
let out = out.replace("_", "\\_");
let out = out.replace("*", "\\*");
let out = out.replace("~", "\\~");
let out = out.replace("#", "\\#");
let out = out.replace("=", "\\=");
let out = out.replace(".", "\\.");
let out = out.replace("!", "\\!");
let out = out.replace("|", "\\|");
let out = out.replace("(", "\\(");
let out = out.replace(")", "\\)");
let out = out.replace("[", "\\[");
let out = out.replace("]", "\\]");
let out = out.replace("{", "\\{");
let out = out.replace("}", "\\}");
let out = out.replace("`", "\\`");
let out = out.replace(">", "\\>");
out
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let trending = get_trending_rust_repo().await?.all();
for repo in &trending {
println!(
"[{}]({}): {}",
escape_markdown_for_telegram(&repo.name),
escape_markdown_for_telegram(&repo.url()),
escape_markdown_for_telegram(&repo.description)
);
}
let repos: Vec<_> = trending
.iter()
.map(|repo| format!("{}/{}", repo.owner, repo.name))
.collect();
let content = serde_json::to_string(&repos)?;
let date = std::env::args().nth(1).unwrap_or_else(|| {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
format!("{}", now)
});
let path = format!("./archive/{}.json", date);
std::fs::write(path, content)?;
Ok(())
}