forked from 1b-agent/opencadstudio-upstream
feat(plugin-api): entity-class display declarations on the manifest (API v10)
Plugins can now declare the entity classes they identify via XDATA, and the
host resolves them to display-only type labels while the declaring plugin is
loaded.
- Append `BuiltinPlugin::entity_classes()` (a guarded trailing vtable slot,
the same additive pattern as `on_load` in v5) returning a &'static
`EntityClasses { app_id, class_prefix, labels }`. The static
`PluginManifest` struct is deliberately untouched: older cdylibs share it
by pointer and its layout is frozen ABI since v1, so adding a field would
read past their allocation.
- `OwnedEntityClasses` travels on the registered manifest as
`OwnedPluginManifest.entity_classes` with `#[serde(default)]`, so manifests
serialized before the field keep decoding (older runners tolerate it
both ways).
- The runner folds the declaration into the GetManifest registration only
when the loaded cdylib's exported `ocs_plugin_api_version` symbol reports
>= 10 — an older binary's vtable predates the slot, so it is never called;
its entities simply keep their native type names.
- `PluginManager::entity_class_declarations` exposes the live set, filtered
to alive, non-disabled plugins in load order. The registered manifests are
the only source and nothing is cached: not installed, disabled,
cap-excluded (`OCS_PLUGIN_MAX_API_VERSION`), failed at load, removed, or a
dead process all contribute nothing.
- Embedded version info `api_version` follows the bump to 10;
`API_VERSION_MIN_SUPPORTED` stays 3.
Tests: runner fold (v10 folds, pre-v10 skipped, `entity_classes()` panic is
contained and reported), manager filtering (disabled / dead / undeclaring
skipped; declarations disappear once the process dies — verified with a real
killed child), bincode registration round-trip, and older-manifest serde
default.
This commit is contained in:
1 parent
859070403c
commit
60eb7b086e
9 files changed
+502
-13
No files matched your search
@@ -16,7 +16,7 @@ use std::path::PathBuf;
|
||||
|
||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
|
||||
use crate::manifest::PluginManifest;
|
||||
use crate::manifest::{EntityClasses, PluginManifest};
|
||||
use crate::ribbon::CadModule;
|
||||
|
||||
// Re-export the opencadcodec crate and the types that appear in the HostApi trait
|
||||
@@ -659,6 +659,21 @@ pub trait BuiltinPlugin: Send + Sync {
|
||||
/// Added in API v5. The runner only calls this for plugins that report API
|
||||
/// major 5 or newer.
|
||||
fn on_load(&mut self, _host: &mut dyn HostApi) {}
|
||||
|
||||
/// Entity-class display declarations (API v10): the XDATA
|
||||
/// class-identity keys the plugin stamps on entities, mapped to the
|
||||
/// display labels the host shows while this plugin is loaded (e.g. the
|
||||
/// Properties panel title becomes `"Linear Element (Line)"`). Display-only
|
||||
/// — the labels never round-trip the drawing and never govern behavior;
|
||||
/// entities carry only the stable identity keys in their XDATA.
|
||||
///
|
||||
/// The default (`None`) declares no entity classes. The runner only calls
|
||||
/// this for plugins whose exported `ocs_plugin_api_version` symbol reports
|
||||
/// API major 10 or newer, so older cdylibs are never touched past their
|
||||
/// vtable.
|
||||
fn entity_classes(&self) -> Option<&'static EntityClasses> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// A point-driven interactive command a plugin starts via
|
||||
|
||||
Reference in new issue
Block a user