Skip to content

Commit b1af501

Browse files
committed
all command json and simple display
1 parent 042fb10 commit b1af501

6 files changed

Lines changed: 110 additions & 6 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ exclude = [".gitignore", ".github/*"]
1616

1717
[dependencies]
1818
reqwest = { version = "0.12", features = ["json", "blocking"] }
19+
serde_json = "1.0"
1920

2021
[[bin]]
2122
name = "gstats"

src/commands/all.rs

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,83 @@
1-
pub fn all(owner: String, repo: String) -> Result<(), Box<dyn std::error::Error>> {
2-
let body = reqwest::blocking::get(format!("https://api.github.com/repos/{}/{}", owner, repo))?
3-
.text()?;
1+
use crate::utils::{pretty_dates, request};
2+
use serde_json::Value;
3+
4+
pub fn all(
5+
owner: String,
6+
repo: String,
7+
output: Option<String>,
8+
display: bool,
9+
) -> Result<(), Box<dyn std::error::Error>> {
10+
let url = format!("https://api.github.com/repos/{}/{}", owner, repo);
11+
12+
let json = request(url)?;
13+
14+
if !display {
15+
println!("{:#?}", json);
16+
} else {
17+
simplify_and_display_json(json)
18+
}
419

5-
println!("body = {body:?}");
620
Ok(())
721
}
22+
23+
fn simplify_and_display_json(json: Value) {
24+
// General Info
25+
let name = &json["name"].as_str().unwrap_or("None");
26+
let description = &json["description"].as_str().unwrap_or("None");
27+
// Repo Status
28+
let forking = &json["allow_forking"];
29+
let archived = &json["archived"];
30+
let fork = &json["fork"];
31+
let disabled = &json["disabled"];
32+
let private = &json["private"];
33+
// Activity Metrics
34+
let stars = &json["stargazers_count"];
35+
let forks = &json["forks_count"];
36+
let watches = &json["watchers_count"];
37+
let open_issues = &json["open_issues_count"];
38+
// Repository URLs
39+
let html_url = &json["html_url"].as_str().unwrap_or("None");
40+
let clone_url = &json["clone_url"].as_str().unwrap_or("None");
41+
let homepage = &json["homepage"].as_str().unwrap_or("None");
42+
// Development Details
43+
let language = &json["language"].as_str().unwrap_or("None");
44+
let default_branch = &json["default_branch"].as_str().unwrap_or("None");
45+
let license = &json["license"]["name"].as_str().unwrap_or("None");
46+
// Important Dates
47+
let created_at = &json["created_at"].as_str().unwrap_or("None");
48+
let updated_at = &json["updated_at"].as_str().unwrap_or("None");
49+
let pushed_at = &json["pushed_at"].as_str().unwrap_or("None");
50+
51+
println!("GENERAL INFO");
52+
println!(" {:<14}: {}", "Name", name);
53+
println!(" {:<14}: {}", "Description", description);
54+
println!();
55+
println!("REPO STATUS");
56+
println!(" {:<14}: {}", "Allows forks", forking);
57+
println!(" {:<14}: {}", "Archived", archived);
58+
println!(" {:<14}: {}", "Fork", fork);
59+
println!(" {:<14}: {}", "Disabled", disabled);
60+
println!(" {:<14}: {}", "Private", private);
61+
println!();
62+
println!("ACTIVITY METRICS");
63+
println!(" {:<14}: {}", "Stars", stars);
64+
println!(" {:<14}: {}", "Forks", forks);
65+
println!(" {:<14}: {}", "Watches", watches);
66+
println!(" {:<14}: {}", "Open issues", open_issues);
67+
println!();
68+
println!("REPOSITORY URLS");
69+
println!(" {:<14}: {}", "HTML URL", html_url);
70+
println!(" {:<14}: {}", "Clone URL", clone_url);
71+
println!(" {:<14}: {}", "Homepage", homepage);
72+
println!();
73+
println!("DEVELOPMENT DETAILS");
74+
println!(" {:<14}: {}", "Language", language);
75+
println!(" {:<14}: {}", "Default branch", default_branch);
76+
println!(" {:<14}: {}", "License", license);
77+
println!();
78+
println!("IMPORTANT DATES");
79+
println!(" {:<14}: {}", "Created at", pretty_dates(created_at));
80+
println!(" {:<14}: {}", "Updated at", pretty_dates(updated_at));
81+
println!(" {:<14}: {}", "Pushed at", pretty_dates(pushed_at));
82+
println!();
83+
}

src/commands/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pub mod all;
1+
pub mod all;

src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub mod cli;
22
pub mod commands;
3+
pub mod utils;
34

45
use crate::commands::all::all;
56
use cli::{Arg, Cli, Command};
@@ -134,7 +135,7 @@ fn main() {
134135
let output = command.get_value_of("output").to_option();
135136
let display = command.has("display");
136137

137-
all(owner, repo);
138+
let _ = all(owner, repo, output, display);
138139
}
139140
"downloads" => {
140141
let owner = command.get_value_of("owner").throw_if_none();

src/utils.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use reqwest::header::{HeaderMap, ACCEPT, USER_AGENT};
2+
use serde_json::Value;
3+
4+
pub fn request(url: String) -> Result<Value, Box<dyn std::error::Error>> {
5+
let headers = construct_header();
6+
let client = reqwest::blocking::Client::new();
7+
let res = client.get(url).headers(headers).send()?;
8+
let body = res.text()?;
9+
let json = serde_json::from_str::<serde_json::Value>(&body)?;
10+
11+
Ok(json)
12+
}
13+
14+
fn construct_header() -> HeaderMap {
15+
let mut headers = HeaderMap::new();
16+
headers.insert(USER_AGENT, "User".parse().unwrap());
17+
headers.insert(ACCEPT, "application/vnd.github.v3+json".parse().unwrap());
18+
return headers;
19+
}
20+
21+
pub fn pretty_dates(date: &str) -> String {
22+
let date = date.split('T').collect::<Vec<&str>>();
23+
let date = date[0].split('-').collect::<Vec<&str>>();
24+
format!("{}-{}-{}", date[2], date[1], date[0])
25+
}

0 commit comments

Comments
 (0)