rialoman 0.2.0

Rialo native toolchain manager
Documentation
//! Manifest models describing releases and their artifacts.
// Copyright (c) Subzero Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

use serde::{Deserialize, Serialize};

use crate::spec::Channel;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Manifest {
    pub manifest_version: u32,
    pub channel: Channel,
    pub version: String,
    pub commit: Option<String>,
    pub built_at: Option<String>,
    pub artifacts: Vec<Artifact>,
    #[serde(default)]
    pub rust_toolchain: Option<String>,
}

impl Manifest {
    pub fn find_matching(&self, platform: KnownPlatform) -> Option<&Artifact> {
        self.artifacts
            .iter()
            .find(|a| a.os == platform.os() && a.arch == platform.arch())
    }

    pub fn has_rust_toolchain(&self) -> bool {
        self.rust_toolchain.is_some()
    }

    pub fn rust_toolchain_version(&self) -> Option<&str> {
        self.rust_toolchain.as_deref()
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Artifact {
    pub archive: String,
    pub os: String,
    pub arch: String,
    pub path: String,
    pub sha256: String,
    pub binaries: Vec<String>,
    #[serde(default)]
    pub files: Vec<String>,
    #[serde(default)]
    pub directories: Vec<DirectoryInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DirectoryInfo {
    pub path: String,
    pub description: String,
    #[serde(default)]
    pub size_bytes: u64,
}

#[derive(Clone, Copy, Eq, PartialEq, Debug)]
pub enum KnownPlatform {
    LinuxArm64,
    LinuxAmd64,
    DarwinArm64,
}

impl KnownPlatform {
    pub fn os(&self) -> &'static str {
        match self {
            KnownPlatform::LinuxArm64 => "linux",
            KnownPlatform::LinuxAmd64 => "linux",
            KnownPlatform::DarwinArm64 => "darwin",
        }
    }

    pub fn arch(&self) -> &'static str {
        match self {
            KnownPlatform::LinuxArm64 => "arm64",
            KnownPlatform::LinuxAmd64 => "amd64",
            KnownPlatform::DarwinArm64 => "arm64",
        }
    }
}