use std::io::{self, Error, ErrorKind};
use serde::{Deserialize, Serialize};
pub async fn fetch_latest_release(org: &str, repo: &str) -> io::Result<ReleaseResponse> {
let ep = format!(
"https://api.github.com/repos/{}/{}/releases/latest",
org, repo
);
log::info!("fetching {}", ep);
let rb = http_manager::get_non_tls(&ep, "").await?;
let resp: ReleaseResponse = match serde_json::from_slice(&rb) {
Ok(p) => p,
Err(e) => {
return Err(Error::new(
ErrorKind::Other,
format!("failed to decode {}", e),
));
}
};
Ok(resp)
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
#[serde(rename_all = "snake_case")]
pub struct ReleaseResponse {
pub tag_name: Option<String>,
pub assets: Option<Vec<Asset>>,
#[serde(default)]
pub prerelease: bool,
}
impl Default for ReleaseResponse {
fn default() -> Self {
Self::default()
}
}
impl ReleaseResponse {
pub fn default() -> Self {
Self {
tag_name: None,
assets: None,
prerelease: false,
}
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
#[serde(rename_all = "snake_case")]
pub struct Asset {
pub name: String,
pub browser_download_url: String,
}