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",
}
}
}