ghrs 0.1.3

A simple client for GitHub v3 API
Documentation
use ghrs::{model::EventType, model::Payload, Client};

use chrono::NaiveDate;

fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    let args: Vec<String> = std::env::args().collect();
    let user = args.get(1).unwrap();
    let from = if args.get(2).is_some() {
        let from = args.get(2).unwrap();
        Some(NaiveDate::parse_from_str(from, "%Y-%m-%d")?)
    } else {
        None
    };
    let to = if args.get(3).is_some() {
        let to = args.get(3).unwrap();
        Some(NaiveDate::parse_from_str(to, "%Y-%m-%d")?)
    } else {
        None
    };

    let client = Client::new();
    let mut current_page = client
        .events()
        .list_user_events(user)
        .per_page(100)
        .send()?;
    let mut events = current_page.take_items();

    while let Some(next_page) = current_page.get_next_page() {
        current_page = next_page;
        events.extend(current_page.take_items());
    }

    let mut issues_events = Vec::new();
    let mut pull_request_events = Vec::new();
    let mut pull_request_review_comment_events = Vec::new();
    let mut issue_comment_events = Vec::new();
    let mut commit_comment_events = Vec::new();
    for event in events.into_iter() {
        if let Some(from) = from {
            if event.created_at.naive_utc().date() < from {
                continue;
            }
        }
        if let Some(to) = to {
            if to < event.created_at.naive_utc().date() {
                continue;
            }
        }
        match event.r#type {
            EventType::IssuesEvent => issues_events.push(event),
            EventType::PullRequestEvent => pull_request_events.push(event),
            EventType::PullRequestReviewCommentEvent => {
                pull_request_review_comment_events.push(event)
            }
            EventType::IssueCommentEvent => issue_comment_events.push(event),
            EventType::CommitCommentEvent => commit_comment_events.push(event),
            _ => {}
        }
    }

    println!("## Issues Event");
    for event in issues_events {
        if let Payload::IssuesEventPayload(payload) = event.payload.unwrap() {
            println!("- [{}]({})", payload.issue.title, payload.issue.html_url);
        }
    }
    println!("");
    println!("## Pull Request Event");
    for event in pull_request_events {
        if let Payload::PullRequestEventPayload(payload) = event.payload.unwrap() {
            println!(
                "- [{}]({})",
                payload.pull_request.title, payload.pull_request.html_url
            );
        }
    }
    println!("");
    println!("## Pull Request Review Comment Event");
    for event in pull_request_review_comment_events {
        if let Payload::PullRequestReviewCommentEventPayload(payload) = event.payload.unwrap() {
            println!(
                "- [{}]({})",
                payload.pull_request.title, payload.comment.html_url
            );
        }
    }
    println!("");
    println!("## Issue Comment Event");
    for event in issue_comment_events {
        if let Payload::IssueCommentEventPayload(payload) = event.payload.unwrap() {
            println!("- [{}]({})", payload.issue.title, payload.comment.html_url);
        }
    }
    println!("");
    println!("## Commit Comment Event");
    for event in commit_comment_events {
        if let Payload::CommitCommentEventPayload(payload) = event.payload.unwrap() {
            println!(
                "- [{}]({})",
                payload.comment.html_url, payload.comment.html_url
            );
        }
    }
    println!("");
    Ok(())
}