use serde::Deserialize;
use std::collections::HashMap;
use std::sync::OnceLock;
#[derive(Debug, Deserialize)]
pub struct MicroarchitecturesSchema {
pub microarchitectures: HashMap<String, Microarchitecture>,
pub feature_aliases: HashMap<String, FeatureAlias>,
pub conversions: Conversions,
}
impl MicroarchitecturesSchema {
pub fn schema() -> &'static MicroarchitecturesSchema {
static SCHEMA: OnceLock<MicroarchitecturesSchema> = OnceLock::new();
SCHEMA.get_or_init(|| {
serde_json::from_str(include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/json/cpu/microarchitectures.json"
)))
.expect("Failed to load microarchitectures.json")
})
}
}
#[derive(Debug, Deserialize)]
pub struct Microarchitecture {
#[serde(deserialize_with = "super::zero_one_many_string")]
pub from: Vec<String>,
pub vendor: String,
pub features: Vec<String>,
pub compilers: Option<HashMap<String, CompilerSet>>,
pub generation: Option<usize>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(untagged)]
pub enum CompilerSet {
Several(Vec<Compiler>),
Single(Compiler),
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
pub struct Compiler {
pub versions: String,
pub flags: String,
pub name: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FeatureAlias {
pub reason: Option<String>,
pub any_of: Option<Vec<String>>,
pub families: Option<Vec<String>>,
}
#[derive(Debug, Deserialize)]
pub struct Conversions {
pub description: String,
pub arm_vendors: HashMap<String, String>,
pub darwin_flags: HashMap<String, String>,
}