github-trending-rs 0.0.5

A simple Rust crate to fetch trending repositories from GitHub.
Documentation
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 {
    // TODO: optimize this, or don't, do I care?
    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(())
}