use std::path::PathBuf; use linear_map::LinearMap; use crate::actions::Action; use crate::dependencies::Dependencies; use crate::tor::HiddenServiceVersion; use crate::tor::PortMapping; pub type ManifestLatest = ManifestV0; #[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] pub struct Description { pub short: String, pub long: String, } #[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] #[serde(tag = "type")] #[serde(rename_all = "snake_case")] pub enum ImageConfig { Tar, } #[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] pub struct Asset { pub src: PathBuf, pub dst: PathBuf, pub overwrite: bool, } #[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "kebab-case")] pub struct ManifestV0 { pub id: String, pub version: emver::Version, pub title: String, pub description: Description, pub release_notes: String, #[serde(default)] pub install_alert: Option, #[serde(default)] pub uninstall_alert: Option, #[serde(default)] pub restore_alert: Option, #[serde(default)] pub start_alert: Option, #[serde(default)] pub has_instructions: bool, #[serde(default = "emver::VersionRange::any")] pub os_version_required: emver::VersionRange, #[serde(default = "emver::VersionRange::any")] pub os_version_recommended: emver::VersionRange, pub ports: Vec, pub image: ImageConfig, #[serde(default)] pub shm_size_mb: Option, pub mount: PathBuf, #[serde(default)] pub public: Option, #[serde(default)] pub shared: Option, #[serde(default)] pub assets: Vec, #[serde(default)] pub hidden_service_version: HiddenServiceVersion, #[serde(default)] pub dependencies: Dependencies, #[serde(default)] pub actions: Vec, #[serde(flatten)] pub extra: LinearMap, } #[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] #[serde(tag = "compat")] #[serde(rename_all = "lowercase")] pub enum Manifest { V0(ManifestV0), } impl Manifest { pub fn into_latest(self) -> ManifestLatest { match self { Manifest::V0(m) => m, } } }