refactor(plugin): extract ocs_plugin_api crate for the stable add-on contract
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>
This commit is contained in:
parent
7a4ddbc62e
commit
72ec1146df
9 changed files with 280 additions and 154 deletions
51
crates/ocs_plugin_api/src/manifest.rs
Normal file
51
crates/ocs_plugin_api/src/manifest.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
//! 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],
|
||||
}
|
||||
Loading…
Reference in a new issue