This repository has been archived on 2024-04-27. You can view files and clone it, but cannot push or open issues or pull requests.
release-info/src/main.rs

77 lines
2.1 KiB
Rust

use anyhow::{anyhow, Result};
use argh::FromArgs;
use json_in_type::{inlined_json_object, json_object, JSONValue};
use semver::Version;
use std::fs::read_dir;
use tiny_http::{Header, Response, Server};
#[derive(FromArgs)]
/// Generate release info
struct ReleaseInfo {
/// base path to look for versions
#[argh(option, short = 'p')]
basepath: Option<String>,
/// bind address
#[argh(option, short = 'b')]
bind: Option<String>,
}
fn get_versions(base: &str) -> Result<String> {
let paths = read_dir(base)?;
let mut versions = vec![];
// Get all versions
for path in paths {
let dir = path?.path();
let pathname = dir.file_name().unwrap().to_str().unwrap();
if dir.is_dir() && pathname.starts_with('v') {
// Path is a version, add it to the list
versions.push(Version::parse(&pathname[1..])?);
}
}
// Sort versions in descending order
versions.sort_by(|a, b| b.cmp(a));
// Get latest version (and latest stable version)
let latest = format!("v{}", versions[0]);
let latest_stable = versions
.iter()
.find(|v| v.pre.is_empty())
.map(|v| format!("v{}", v));
let versions_str = versions
.iter()
.map(|v| format!("v{}", v))
.collect::<Vec<String>>();
let info = json_object! { latest, latest_stable, versions: versions_str };
Ok(info.to_json_string())
}
fn main() -> Result<()> {
let args: ReleaseInfo = argh::from_env();
let server = Server::http(args.bind.unwrap_or_else(|| "0.0.0.0:8000".to_string()))
.map_err(|err| anyhow!(err))?;
let base = args.basepath.unwrap_or_else(|| ".".to_string());
let json = Header::from_bytes(&b"Content-Type"[..], &b"application/json"[..]).unwrap();
for request in server.incoming_requests() {
let versions = get_versions(&base)?;
let response = Response::from_string(versions).with_header(json.clone());
let res = request.respond(response);
// Log any errors
if let Err(err) = res {
println!("error: {}", err);
}
}
Ok(())
}