aboutsummaryrefslogtreecommitdiff
path: root/src/app/api/plugins/manifest.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/api/plugins/manifest.rs')
-rw-r--r--src/app/api/plugins/manifest.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/app/api/plugins/manifest.rs b/src/app/api/plugins/manifest.rs
index 92799aae..92ab4754 100644
--- a/src/app/api/plugins/manifest.rs
+++ b/src/app/api/plugins/manifest.rs
@@ -13,6 +13,8 @@ struct RawPluginManifest {
name: String,
version: String,
#[serde(default)]
+ min_herdr_version: Option<String>,
+ #[serde(default)]
description: Option<String>,
#[serde(default)]
platforms: Option<Vec<RawPlatform>>,
@@ -133,6 +135,7 @@ pub(crate) fn load_plugin_manifest(
"invalid_plugin_version",
"plugin version is required",
)?;
+ let min_herdr_version = validate_min_herdr_version(raw.min_herdr_version.as_deref())?;
let description = raw
.description
.map(|description| description.trim().to_string())
@@ -180,6 +183,7 @@ pub(crate) fn load_plugin_manifest(
plugin_id,
name,
version,
+ min_herdr_version,
description,
manifest_path: manifest_path.display().to_string(),
plugin_root: plugin_root.display().to_string(),
@@ -195,6 +199,37 @@ pub(crate) fn load_plugin_manifest(
})
}
+fn validate_min_herdr_version(value: Option<&str>) -> Result<String, (&'static str, String)> {
+ let Some(value) = value else {
+ return Err((
+ "invalid_plugin_min_herdr_version",
+ "plugin min_herdr_version is required".to_string(),
+ ));
+ };
+ let value = non_empty_trimmed(
+ value,
+ "invalid_plugin_min_herdr_version",
+ "plugin min_herdr_version is required",
+ )?;
+ let required = crate::update::Version::parse(&value).ok_or_else(|| {
+ (
+ "invalid_plugin_min_herdr_version",
+ format!(
+ "plugin min_herdr_version must be a semantic version like {}",
+ crate::build_info::BASE_VERSION
+ ),
+ )
+ })?;
+ let current = crate::update::Version::current();
+ if required > current {
+ return Err((
+ "plugin_requires_newer_herdr",
+ format!("plugin requires Herdr {required} or newer; current Herdr is {current}"),
+ ));
+ }
+ Ok(required.to_string())
+}
+
fn normalize_manifest_build(
build: RawPluginManifestBuild,
) -> Result<PluginManifestBuild, (&'static str, String)> {