news_cli 1.3.3

A CLI to see developer news in the terminal 🐢
Documentation
use std::error::Error;

use crabquery::Document;
use terminal_spinners::{SpinnerBuilder, FLIP, MOON};

use crate::scrape::link::get_html;

use super::Issue;

const CPP_WEEKLY: &str = "https://cpp.libhunt.com/newsletter/archive";

pub fn get_cpp_issues_news() -> Result<(Vec<Issue>, Vec<String>), Box<dyn Error>> {
    let handle = SpinnerBuilder::new()
        .spinner(&FLIP)
        .text(" Fetching Cpp Issues")
        .start();

    let text = get_html(CPP_WEEKLY);

    let doc = Document::from(text);

    let mut issues = doc.select("tr");
    let mut vec_issues: Vec<Issue> = vec![];
    issues.remove(0);
    for issue in issues {
        let raw_title = issue
            .children()
            .get(1)
            .unwrap()
            .children()
            .first()
            .unwrap()
            .text()
            .expect("Failed to get");
        let issue_number = issue
            .children()
            .get(1)
            .unwrap()
            .children()
            .first()
            .unwrap()
            .attr("href")
            .expect("Failed to get");
        let vec: Vec<_> = raw_title.split('-').collect();
        let title_str = *vec.get(1).expect("Failed to get");
        let title = String::from(title_str);
        let date = issue
            .children()
            .first()
            .unwrap()
            .text()
            .expect("Failed to get");
        let name = format!("{title} - {date}");
        let url_completed = format!("https://cpp.libhunt.com{issue_number}");
        let new = Issue {
            title: name,
            link: url_completed,
        };
        vec_issues.push(new);
    }

    let issues_options: Vec<_> = vec_issues.iter().map(|new| new.title.clone()).collect();

    handle.done();

    Ok((vec_issues, issues_options))
}

pub fn get_last_cpp_issue() -> Result<Issue, Box<dyn Error>> {
    let text = get_html(CPP_WEEKLY);

    let doc = Document::from(text);

    let mut issues = doc.select("tr");

    issues.remove(0);
    let first = issues.first().expect("Failed get first issue");
    let raw_title = first
        .children()
        .get(1)
        .unwrap()
        .children()
        .first()
        .unwrap()
        .text()
        .expect("Failed to get");
    let issue_number = first
        .children()
        .get(1)
        .unwrap()
        .children()
        .first()
        .unwrap()
        .attr("href")
        .expect("Failed to get");
    let vec: Vec<_> = raw_title.split('-').collect();
    let title_str = *vec.get(1).expect("Failed to get");
    let title = String::from(title_str);
    let date = first
        .children()
        .first()
        .unwrap()
        .text()
        .expect("Failed to get");
    let name = format!("{title} - {date}");
    let url_completed = format!("https://cpp.libhunt.com{issue_number}");
    let new = Issue {
        title: name,
        link: url_completed,
    };

    Ok(new)
}

pub fn get_latest_cpp_issue() -> Result<Issue, Box<dyn Error>> {
    let handle = SpinnerBuilder::new()
        .spinner(&MOON)
        .text("Fetching Cpp Last Issue")
        .start();

    let text = get_html(CPP_WEEKLY);

    let doc = Document::from(text);

    let mut issues = doc.select("tr");

    issues.remove(0);
    let first = issues.first().expect("Failed get first issue");
    let raw_title = first
        .children()
        .get(1)
        .unwrap()
        .children()
        .first()
        .unwrap()
        .text()
        .expect("Failed to get");
    let issue_number = first
        .children()
        .get(1)
        .unwrap()
        .children()
        .first()
        .unwrap()
        .attr("href")
        .expect("Failed to get");
    let vec: Vec<_> = raw_title.split('-').collect();
    let title_str = *vec.get(1).expect("Failed to get");
    let title = String::from(title_str);
    let date = first
        .children()
        .first()
        .unwrap()
        .text()
        .expect("Failed to get");
    let name = format!("{title} - {date}");
    let url_completed = format!("https://cpp.libhunt.com{issue_number}");
    let new = Issue {
        title: name,
        link: url_completed,
    };

    handle.done();

    Ok(new)
}