oranda 0.6.5

🎁 generate beautiful landing pages for your projects
Documentation
use crate::errors::*;

use axoproject::GithubRepo;
use gazenot::{Gazenot, PublicRelease, ReleaseAsset};
use serde::{Deserialize, Serialize};

use super::artifacts::{File, ReleaseArtifacts};

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AxoResponse {
    pub success: bool,
    pub result: Vec<AxoRelease>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AxoRelease {
    pub tag_name: String,
    pub name: String,
    pub body: String,
    pub version: String,
    pub prerelease: bool,
    pub created_at: String,
    pub assets: Vec<AxoReleaseAsset>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AxoReleaseAsset {
    pub browser_download_url: String,
    pub name: String,
    pub uploaded_at: String,
}

impl AxoRelease {
    pub async fn fetch_all(package_name: &str, repo: &GithubRepo) -> Result<Vec<AxoRelease>> {
        let abyss = Gazenot::new_unauthed("github".to_string(), repo.owner.clone())?;
        let list = abyss
            .list_releases_many(vec![package_name.to_string()])
            .await?;
        let list = list
            .into_iter()
            .find(|r| r.package_name == package_name)
            .ok_or(OrandaError::AxoReleasesFetchError)?;

        Ok(list.releases.into_iter().map(|r| r.into()).collect())
    }

    pub fn has_dist_manifest(&self) -> bool {
        self.assets.iter().any(|a| a.name == "dist-manifest.json")
    }

    pub fn asset_url<'a>(&'a self, asset_name: &'a str) -> Option<&'a str> {
        for asset in &self.assets {
            if asset.name == asset_name {
                return Some(&asset.browser_download_url);
            }
        }
        None
    }

    pub fn repo_has_releases(name: &str, repo: &GithubRepo) -> Result<bool> {
        if let Ok(releases) =
            tokio::runtime::Handle::current().block_on(AxoRelease::fetch_all(name, repo))
        {
            if releases.is_empty() {
                Ok(false)
            } else {
                Ok(true)
            }
        } else {
            let warning = OrandaError::ReleasesCheckFailed {
                repo: repo.to_string(),
            };
            eprintln!("{:?}", miette::Report::new(warning));
            Ok(false)
        }
    }
}

impl ReleaseArtifacts {
    pub fn add_axodotdev(&mut self, release: &AxoRelease) {
        for asset in &release.assets {
            let file = File {
                name: asset.name.clone(),
                download_url: asset.browser_download_url.clone(),
                view_path: None,
                checksum_file: None,
                infer: true,
            };
            self.add_file(file);
        }
    }
}

impl From<ReleaseAsset> for AxoReleaseAsset {
    fn from(value: ReleaseAsset) -> Self {
        let ReleaseAsset {
            browser_download_url,
            name,
            uploaded_at,
        } = value;

        Self {
            browser_download_url,
            name,
            uploaded_at,
        }
    }
}
impl From<PublicRelease> for AxoRelease {
    fn from(value: PublicRelease) -> Self {
        let PublicRelease {
            tag_name,
            version,
            name,
            body,
            prerelease,
            created_at,
            assets,
        } = value;

        let assets: Vec<AxoReleaseAsset> = assets.into_iter().map(|a| a.into()).collect();

        Self {
            tag_name,
            version,
            name,
            body,
            prerelease,
            created_at,
            assets,
        }
    }
}