forked from 1b-agent/opencadstudio-upstream
Move the dependency-free, semver-versioned half of the plugin contract into a standalone workspace crate `crates/ocs_plugin_api`: - manifest types: PluginManifest, ApiVersion, API_VERSION - ribbon vocabulary: CadModule trait + ToolDef/RibbonGroup/RibbonItem/IconKind/ ModuleEvent/StyleKey The host re-exports them from `crate::plugin::manifest` and `crate::modules`, so every existing call site is unchanged. The acadrust-typed runtime surface (HostSession) stays in the host binary; lifting it behind a HostApi trait in the same crate is the remaining phase-1b step. Part of #100. Docs updated in docs/plugin-architecture.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
52 lines
1.4 KiB
Rust
52 lines
1.4 KiB
Rust
//! Plugin identity and capability declaration.
|
|
|
|
/// Host plugin API version. Bump when the host runtime surface breaks
|
|
/// compatibility.
|
|
pub const API_VERSION: u32 = 1;
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
pub struct ApiVersion {
|
|
pub major: u32,
|
|
}
|
|
|
|
impl ApiVersion {
|
|
pub const CURRENT: Self = Self { major: API_VERSION };
|
|
|
|
pub fn is_compatible_with(host: ApiVersion) -> bool {
|
|
Self::CURRENT.major == host.major
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn current_matches_const() {
|
|
assert_eq!(ApiVersion::CURRENT.major, API_VERSION);
|
|
}
|
|
|
|
#[test]
|
|
fn same_major_is_compatible() {
|
|
assert!(ApiVersion::is_compatible_with(ApiVersion::CURRENT));
|
|
assert!(!ApiVersion::is_compatible_with(ApiVersion {
|
|
major: API_VERSION + 1,
|
|
}));
|
|
}
|
|
}
|
|
|
|
/// Static metadata every plugin supplies at registration time.
|
|
/// Keep fields in sync with `plugin.toml` beside the package.
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub struct PluginManifest {
|
|
pub id: &'static str,
|
|
pub name: &'static str,
|
|
pub version: &'static str,
|
|
pub description: &'static str,
|
|
pub api_version: ApiVersion,
|
|
/// Sort key for add-on ribbon tabs (lower = further left among plugins).
|
|
pub ribbon_order: i32,
|
|
pub xdata_apps: &'static [&'static str],
|
|
pub command_prefixes: &'static [&'static str],
|
|
}
|