diff --git a/src/manifest/channel.rs b/src/manifest/channel.rs index 1aaf323..5c511c2 100755 --- a/src/manifest/channel.rs +++ b/src/manifest/channel.rs @@ -1,4 +1,5 @@ -use langtag::LangTag; +use color_eyre::eyre; +use langtag::LangTagBuf; use serde::Deserialize; use serde_with::serde_as; use url::Url; @@ -7,13 +8,26 @@ use crate::{ManifestInfo, app::arch::Arch}; use super::{ChannelItemType, Payload}; +pub const CHANNEL_ENDPOINT_URL: &str = "https://aka.ms/vs/17/release/channel"; +pub const PREVIEW_CHANNEL_ENDPOINT_URL: &str = "https://aka.ms/vs/17/pre/channel"; + #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct Manifest<'manifest> { +pub struct Manifest { pub manifest_version: String, pub info: ChannelManifestInfo, - #[serde(borrow)] - pub channel_items: Vec>, + pub channel_items: Vec, +} + +impl Manifest { + pub fn from_endpoint(endpoint: Url) -> eyre::Result { + if !endpoint.domain().is_some_and(|domain| domain == "aka.ms") { + tracing::warn!("Endpoint is not a Microsoft shortened link"); + } + + let mut resp = ureq::get(endpoint.as_str()).call()?; + Ok(resp.body_mut().read_json::()?) + } } ManifestInfo! { @@ -29,13 +43,12 @@ ManifestInfo! { #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] #[serde_as] -pub struct ChannelItem<'lang> { +pub struct ChannelItem { pub id: String, pub version: String, pub r#type: ChannelItemType, pub payloads: Option>, - #[serde(borrow)] - pub localized_resoures: Option>>, + pub localized_resoures: Option>, #[serde_as(as = "FromStr")] pub chip: Arch, #[serde_as(as = "FromStr")] @@ -47,9 +60,8 @@ pub struct ChannelItem<'lang> { #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct LocalizedResource<'lang> { - #[serde(borrow)] - pub language: &'lang LangTag, +pub struct LocalizedResource { + pub language: LangTagBuf, pub title: String, pub description: String, pub license: Url, diff --git a/src/manifest/mod.rs b/src/manifest/mod.rs index d571e90..de98e61 100755 --- a/src/manifest/mod.rs +++ b/src/manifest/mod.rs @@ -57,4 +57,4 @@ pub struct Payload { pub size: usize, pub url: Url, pub signer: Option>, -} +} \ No newline at end of file