forked from 1b-agent/opencadstudio-upstream
Plugins targeted the host's concrete HostSession type. Add a HostApi trait in ocs_plugin_api behind an optional `host` feature (the only thing that pulls acadrust, so the core crate stays dependency-free). HostSession implements it and BuiltinPlugin::dispatch now takes `&mut dyn HostApi`, so an out-of-tree add-on compiles against the contract crate alone. Per-tab plugin state is reached through object-safe plugin_state* helpers. Completes the phase-1 host-surface extraction in the #100 epic. Co-Authored-By: Claude Opus 4.8 <[email protected]>
Add-on plugin template
Copy this folder to src/modules/<your_module>/ and rename placeholders.
Quick start
- Copy files into
src/modules/my_plugin/. - Replace
MY_PLUGIN,my_plugin,opencad.my_plugin,MP_throughout. - Add
pub mod my_plugin;tosrc/modules/mod.rs. cargo build— ribbon tab and commands register automatically.
Required files
| File | Purpose |
|---|---|
plugin.toml |
Metadata (QGIS-style); excludes dir from build.rs ribbon scan |
manifest.rs |
Compile-time PluginManifest — keep in sync with plugin.toml |
register.rs |
inventory::submit!(PluginRegistration { … }) only |
plugin.rs |
Thin BuiltinPlugin impl |
dispatch.rs |
All command handlers |
mod.rs |
CadModule ribbon + CommandRegistration for autocomplete |
PLUGIN.md |
XDATA schemas and command reference |
Optional
| File | Purpose |
|---|---|
state.rs |
Per-document tab state via host.ensure_plugin_state(PLUGIN_ID, …) |
crates/my_engine/ |
Headless domain logic (no iced/acadrust) |
See docs/plugin-architecture.md for the full spec.