use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use super::Platform;
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "filesystem.plugins.Manifest")]
pub struct Manifest {
pub description: String,
pub version: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub author: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub homepage: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub license: Option<String>,
#[serde(default, skip_serializing_if = "Binaries::is_empty")]
#[schemars(extend("omitempty" = true))]
pub binaries: Binaries,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub viewer_zip: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub viewer_routes: Vec<ViewerRoute>,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub mobile_ready: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[schemars(rename = "filesystem.plugins.Binaries")]
pub struct Binaries {
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub linux_x86_64: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub linux_aarch64: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub windows_x86_64: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub windows_aarch64: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub macos_x86_64: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub macos_aarch64: Option<String>,
}
impl Binaries {
pub fn get(&self, platform: Platform) -> Option<&String> {
match platform {
Platform::LinuxX86_64 => self.linux_x86_64.as_ref(),
Platform::LinuxAarch64 => self.linux_aarch64.as_ref(),
Platform::WindowsX86_64 => self.windows_x86_64.as_ref(),
Platform::WindowsAarch64 => self.windows_aarch64.as_ref(),
Platform::MacosX86_64 => self.macos_x86_64.as_ref(),
Platform::MacosAarch64 => self.macos_aarch64.as_ref(),
}
}
pub fn is_empty(&self) -> bool {
self.linux_x86_64.is_none()
&& self.linux_aarch64.is_none()
&& self.windows_x86_64.is_none()
&& self.windows_aarch64.is_none()
&& self.macos_x86_64.is_none()
&& self.macos_aarch64.is_none()
}
pub fn len(&self) -> usize {
[
&self.linux_x86_64,
&self.linux_aarch64,
&self.windows_x86_64,
&self.windows_aarch64,
&self.macos_x86_64,
&self.macos_aarch64,
]
.iter()
.filter(|o| o.is_some())
.count()
}
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "filesystem.plugins.ViewerRoute")]
pub struct ViewerRoute {
pub path: String,
pub method: HttpMethod,
#[serde(rename = "type")]
pub r#type: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "filesystem.plugins.HttpMethod")]
#[serde(rename_all = "UPPERCASE")]
pub enum HttpMethod {
Get,
Post,
Put,
Patch,
Delete,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "filesystem.plugins.ManifestWithNameAndSource")]
pub struct ManifestWithNameAndSource {
pub name: String,
#[serde(flatten)]
pub manifest: Manifest,
pub source: String,
}