Plugins are rind’s components of specific extensible optional scopes of features.

Plugin Trait

pub trait Plugin {
    fn get_metadata(&self) -> PluginMetadata;
    fn provide_orchestrators(&self) -> Vec<Box<dyn Orchestrator>> {
        vec![]
    }
    fn register_extensions(&self, _extm: &mut ExtensionManager) {}
}
 
pub struct PluginMetadata {
    pub name: &'static str,
    pub version: u32,
    pub deps: &'static [&'static str],
    pub caps: PluginCapability,
}

Custom Entity Types

Plugins can register new Metadata types via the RegisterLoader system, enabling custom unit sections.

PluginCapability

Plugin capability is declared as a bitflag:

bitflags! {
    pub struct PluginCapability: u64 {
        const ORCHESTRATORS = 1 << 0;
        const RUNTIMES     = 1 << 1;
        const IPC          = 1 << 2;
        const EXTENSIONS   = 1 << 3;
        const EXTENSIBLE   = 1 << 4;
        const INITRD       = 1 << 5;
    }
}

Metadata Registration

Plugins can introduce new models via extensions.

#[model(
    meta_name = name,
    meta_fields(name, ...),
    derive_metadata(Debug)
)]
pub struct CustomEntity {
    pub name: Ustr,
    // ...
}

Extension System

Extensions use an ExtensionManager stored in thread-local storage, dispatched by TypeId:

thread_local! {
    pub static EXTENSIONS: OnceCell<ExtensionManager> = OnceCell::new();
}

There are three extension variants:

pub enum Extension<T> {
    Enquire(ExtensionEnquire<T>),   // fn(name) -> Result<T>
    Act(ExtensionAct<T>),           // fn(name, &mut T) -> Result<void>
    Resolve(ExtensionResolve<T>),   // fn(name, T) -> Result<T>
}

Plugins register extensions via ExtensionManager::register and the host allows ExtensionExecutionCtx callbacks to return Dispatch actions.

Extension Functions

// act
fn my_act_ext(action: &str, data: &mut TheData) -> CoreResult<()> {
  if action == "do_something" {
	  data.do_something();
  }
  Ok(())
}
 
// resolve
fn my_resolve_ext(action: &str, data: TheData) -> CoreResult<TheData> {
  if action == "do_something" {
	  data.do_something();
  }
  Ok(data) // or a new TheData
}
 
// enquire
fn my_enquire_ext(action: &str) -> CoreResult<TheData> {
  Ok(TheData::new(action)) 
}

Plugin definition

Plugins explicitly declare metadata, Orchestrators, and extensions in one place:

plugin! {
	name: "myplugin",
	version: 0,
	caps: PluginCapability::all(),
	deps: &[],
	create: MyPlugin,
	orchestrators: [MyOrchestrator],
	extensions: [resolve(inject_builtin), act(register_trigger)],
	struct MyPlugin;
};

See also: Orchestrators, Runtimes, Boot, Metadata