use crate::id::Id;
use schematic::Schematic;
use serde::{Deserialize, Serialize};
use url::Url;
use warpgate::PluginLocator;
#[derive(Debug, Deserialize, Serialize, Schematic)]
#[serde(rename_all = "lowercase")]
pub enum PluginFormat {
Json,
Toml,
Wasm,
Yaml,
}
#[derive(Debug, Default, Deserialize, Serialize, Schematic)]
pub struct PluginPerson {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<Url>,
}
#[derive(Debug, Deserialize, Serialize, Schematic)]
#[serde(untagged)]
pub enum PluginAuthor {
String(String),
Object(PluginPerson),
}
impl PluginAuthor {
pub fn get_name(&self) -> &str {
match self {
Self::String(name) => name,
Self::Object(author) => &author.name,
}
}
}
#[derive(Debug, Default, Deserialize, Serialize, Schematic)]
pub struct PluginDetectionSource {
pub file: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<Url>,
}
#[derive(Debug, Deserialize, Serialize, Schematic)]
#[serde(rename_all = "camelCase")]
pub struct PluginEntry {
pub id: Id,
pub locator: PluginLocator,
pub format: PluginFormat,
pub name: String,
pub description: String,
#[schema(nested)]
pub author: PluginAuthor,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub homepage_url: Option<Url>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository_url: Option<Url>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub devicon: Option<String>,
pub bins: Vec<String>,
#[schema(nested)]
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub detection_sources: Vec<PluginDetectionSource>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub globals_dirs: Vec<String>,
}
#[derive(Debug, Deserialize, Serialize, Schematic)]
pub struct PluginRegistryDocument {
#[serde(rename = "$schema")]
pub schema: String,
pub version: u8,
#[schema(nested)]
pub plugins: Vec<PluginEntry>,
}