added files

This commit is contained in:
Thomas Eppers 2021-08-15 20:49:12 +02:00
commit b26022b993
5 changed files with 1109 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

1013
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

14
Cargo.toml Normal file
View File

@ -0,0 +1,14 @@
[package]
name = "query-docker-tags"
version = "0.1.0"
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
serde = { version = "1.0.127", features = ["derive"] }
serde_json = "1.0.66"
reqwest = { version = "0.11.4", features = ["blocking", "json"] }
chrono = "0.4.19"
# crossterm = "0.17"
# tui = { version = "0.12", default-features = false, features = ['crossterm'] }

View File

@ -0,0 +1,4 @@
#!/bin/bash
sudo apt install libssl-dev

77
src/main.rs Normal file
View File

@ -0,0 +1,77 @@
use chrono::DateTime;
use serde::Deserialize;
#[derive(Deserialize)]
struct Image {
architecture: String,
os: String,
size: i32,
last_pulled: String,
last_pushed: String,
}
#[derive(Deserialize)]
struct Result {
images: Vec<Image>,
last_updater_username: String,
#[serde(rename(deserialize = "name"))]
tag_name: String,
last_updated: String,
}
#[derive(Deserialize)]
struct Tags {
count: i32,
next_page: Option<String>,
prev_page: Option<String>,
results: Vec<Result>,
}
fn main() {
//docker hub exposes tags stored in json at the following url
//https://hub.docker.com/v2/repositories/rocketchat/rocket.chat/tags
//TODO fill them dynamic instead of hardcoded
let group = "rocketchat";
let repo = "rocket.chat";
let request = format!(
"https://hub.docker.com/v2/repositories/{}/{}/tags",
group, repo
);
//get response
let res = reqwest::blocking::get(request).unwrap();
//convert it to json
let raw = res.text().unwrap();
let tags: Tags = serde_json::from_str(&raw).unwrap();
let now = chrono::Utc::now();
for result in tags.results {
let rfc3339 = DateTime::parse_from_rfc3339(&result.last_updated).unwrap();
let dif = now - rfc3339.with_timezone(&chrono::Utc);
println!("{} vor {}", result.tag_name, format_time_nice(dif));
}
}
fn format_time_nice(time: chrono::Duration) -> String {
if time.num_weeks() == 52 {
format!("{} Jahr", (time.num_weeks() / 52) as i32)
} else if time.num_weeks() > 103 {
format!("{} Jahren", (time.num_weeks() / 52) as i32)
} else if time.num_days() == 1 {
format!("{} Tag", time.num_days())
} else if time.num_days() > 1 {
format!("{} Tagen", time.num_days())
} else if time.num_hours() == 1 {
format!("{} Stunde", time.num_hours())
} else if time.num_hours() > 1 {
format!("{} Stunden", time.num_hours())
} else if time.num_minutes() == 1 {
format!("{} Minute", time.num_minutes())
} else if time.num_minutes() > 1 {
format!("{} Minuten", time.num_minutes())
} else {
format!("{} Sekunden", time.num_seconds())
}
}