use std::collections::BTreeMap;
use std::path::{Path, PathBuf};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum PluginBackendKind {
Lua,
Wasi,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PluginManifest {
pub name: String,
pub backend: PluginBackendKind,
pub source: PathBuf,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub aliases: Vec<String>,
#[serde(default)]
pub version: Option<String>,
#[serde(default)]
pub homepage: Option<String>,
#[serde(default)]
pub license: Option<String>,
#[serde(default)]
pub update_url: Option<String>,
#[serde(default)]
pub manifest_url: Option<String>,
#[serde(default)]
pub min_runtime_version: Option<String>,
#[serde(default)]
pub notes: Vec<String>,
#[serde(default)]
pub legacy_filenames: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AvailableVersion {
pub version: String,
#[serde(default)]
pub note: Option<String>,
#[serde(default)]
pub additions: Vec<AvailableAddition>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AvailableAddition {
pub name: String,
pub version: String,
#[serde(default)]
pub note: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct EnvKey {
pub key: String,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Checksum {
pub algorithm: String,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "kebab-case")]
pub enum InstallSource {
Directory { path: PathBuf },
File { path: PathBuf },
Url {
url: String,
#[serde(default)]
headers: BTreeMap<String, String>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct InstallArtifact {
pub name: String,
pub version: String,
pub source: InstallSource,
#[serde(default)]
pub note: Option<String>,
#[serde(default)]
pub checksum: Option<Checksum>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct InstallPlan {
pub plugin: String,
pub version: String,
pub main: InstallArtifact,
#[serde(default)]
pub additions: Vec<InstallArtifact>,
#[serde(default)]
pub legacy_filenames: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct InstalledArtifact {
pub name: String,
pub version: String,
pub path: PathBuf,
#[serde(default)]
pub note: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct InstalledRuntime {
pub plugin: String,
pub version: String,
pub root_dir: PathBuf,
pub main: InstalledArtifact,
#[serde(default)]
pub additions: Vec<InstalledArtifact>,
}
impl InstalledRuntime {
pub fn main_path(&self) -> &Path {
&self.main.path
}
pub fn relocate(&self, new_root: &Path) -> Self {
let relocate_path = |p: &Path| -> PathBuf {
p.strip_prefix(&self.root_dir)
.map(|rel| new_root.join(rel))
.unwrap_or_else(|_| p.to_path_buf())
};
Self {
plugin: self.plugin.clone(),
version: self.version.clone(),
root_dir: new_root.to_path_buf(),
main: InstalledArtifact {
path: relocate_path(&self.main.path),
..self.main.clone()
},
additions: self
.additions
.iter()
.map(|a| InstalledArtifact {
path: relocate_path(&a.path),
..a.clone()
})
.collect(),
}
}
}