use serde::Deserialize;
use super::UpdateError;
use super::provider::{Asset, LatestRelease, ReleaseProvider};
const RELEASES_API: &str = "https://api.github.com/repos/nico2sh/kimun/releases?per_page=100";
const RELEASES_PAGE: &str = "https://github.com/nico2sh/kimun/releases";
const TAG_PREFIX: &str = "kimun-notes-v";
#[derive(Debug, Deserialize)]
struct GhRelease {
tag_name: String,
#[serde(default)]
assets: Vec<GhAsset>,
}
#[derive(Debug, Deserialize)]
struct GhAsset {
name: String,
browser_download_url: String,
}
#[derive(Debug, Default, Clone, Copy)]
pub struct GitHubProvider;
impl ReleaseProvider for GitHubProvider {
fn latest_stable(&self) -> Result<LatestRelease, UpdateError> {
let body = super::http_get(RELEASES_API)?.into_string()?;
let releases: Vec<GhRelease> = serde_json::from_str(&body)?;
releases
.into_iter()
.find_map(|release| {
let version = release.tag_name.strip_prefix(TAG_PREFIX)?;
if version.contains('-') {
return None;
}
Some(LatestRelease {
version: version.to_string(),
assets: release
.assets
.into_iter()
.map(|a| Asset {
name: a.name,
url: a.browser_download_url,
})
.collect(),
})
})
.ok_or(UpdateError::NoRelease)
}
fn releases_url(&self) -> &'static str {
RELEASES_PAGE
}
}