77 lines
2.1 KiB
Rust
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(())
|
|
}
|