#![deny(unused_must_use)]
#![deny(unsafe_code)]
#![forbid(missing_docs)]
use serde::Deserialize;
use std::collections::HashMap;
pub mod fcos;
pub mod rhcos;
#[derive(Debug, Deserialize)]
pub struct Stream {
pub stream: String,
pub architectures: HashMap<String, Arch>,
}
#[derive(Debug, Deserialize)]
pub struct Arch {
pub artifacts: HashMap<String, Platform>,
pub images: Option<Images>,
}
#[derive(Debug, Deserialize)]
pub struct Platform {
pub formats: HashMap<String, HashMap<String, Artifact>>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Artifact {
pub location: String,
pub sha256: String,
pub uncompressed_sha256: Option<String>,
pub signature: Option<String>,
}
pub type AwsImages = ReplicatedImage;
pub type AwsRegionImage = SingleImage;
#[derive(Debug, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ReplicatedImage {
pub regions: HashMap<String, SingleImage>,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub struct SingleImage {
pub release: String,
pub image: String,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub struct ContainerImage {
pub release: String,
pub image: String,
pub digest_ref: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct GcpImage {
pub release: Option<String>,
pub project: String,
pub family: Option<String>,
pub name: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ReplicatedObject {
pub regions: HashMap<String, RegionObject>,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub struct RegionObject {
pub release: String,
pub object: String,
pub bucket: String,
pub url: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Images {
pub aliyun: Option<ReplicatedImage>,
pub aws: Option<ReplicatedImage>,
pub gcp: Option<GcpImage>,
pub ibmcloud: Option<ReplicatedObject>,
pub kubevirt: Option<ContainerImage>,
pub powervs: Option<ReplicatedObject>,
}
impl Stream {
pub fn this_architecture(&self) -> Option<&Arch> {
self.architectures.get(this_architecture())
}
pub fn query_disk(&self, arch: &str, artifact: &str, format_name: &str) -> Option<&Artifact> {
self.architectures
.get(arch)
.and_then(|a| a.artifacts.get(artifact))
.and_then(|p| p.formats.get(format_name))
.and_then(|p| p.get("disk"))
}
pub fn query_thisarch_single(&self, artifact: &str) -> Option<&Artifact> {
self.this_architecture()
.and_then(|a| a.artifacts.get(artifact))
.and_then(|p| p.formats.iter().next())
.and_then(|(_fmt, v)| v.get("disk"))
}
}
pub fn this_architecture() -> &'static str {
match std::env::consts::ARCH {
"powerpc64" if cfg!(target_endian = "big") => "ppc64",
"powerpc64" if cfg!(target_endian = "little") => "ppc64le",
o => o,
}
}