use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
pub(crate) type RelPath = String;
pub(crate) type ArtifactId = String;
pub(crate) type TripleName = String;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct DistManifest {
#[serde(default)]
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
pub(crate) artifacts: BTreeMap<ArtifactId, Artifact>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct Artifact {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub(crate) kind: Option<ArtifactId>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub(crate) name: Option<ArtifactId>,
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(default)]
pub(crate) target_triples: Vec<TripleName>,
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(default)]
pub(crate) assets: Vec<Asset>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct Asset {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) executable_name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) path: Option<RelPath>,
#[serde(flatten)]
pub(crate) kind: AssetKind,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind")]
#[non_exhaustive]
pub(crate) enum AssetKind {
#[serde(rename = "executable")]
Executable(ExecutableAsset),
#[serde(rename = "c_dynamic_library")]
CDynamicLibrary(DynamicLibraryAsset),
#[serde(rename = "c_static_library")]
CStaticLibrary(StaticLibraryAsset),
#[serde(rename = "readme")]
Readme,
#[serde(rename = "license")]
License,
#[serde(rename = "changelog")]
Changelog,
#[serde(other)]
#[serde(rename = "unknown")]
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct ExecutableAsset {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub(crate) symbols_artifact: Option<ArtifactId>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct DynamicLibraryAsset {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub(crate) symbols_artifact: Option<ArtifactId>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct StaticLibraryAsset {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub(crate) symbols_artifact: Option<ArtifactId>,
}