pub struct Binding<PluginId, Ctx, Plugins = ExactlyOne<PluginId, PluginInstance<Ctx>>>(/* private fields */)
where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Send + Sync;Expand description
An abstract contract specifying what plugins must implement (via plugs) or what
they could depend on (via sockets). It bundles one or more WIT Interfaces
under a single package name.
Binding is a handle to shared state. Cloning a Binding creates another handle
to the same underlying binding, enabling shared dependencies where multiple
plugins depend on the same binding.
let binding: Binding<String, Ctx> = Binding::new(
"my:package",
HashMap::from([
( "api".to_string(), Interface::new(
HashMap::from([( "get-value".into(), Function::new(
FunctionKind::Freestanding,
ReturnKind::MayContainResources,
))]),
HashSet::from([ "my-resource".to_string() ]),
)),
]),
ExactlyOne( "my-plugin".to_string(), plugin ),
);
// Clone for shared dependencies - both refer to the same binding
let binding_clone = binding.clone();§Type Parameters
PluginId: Unique identifier type for plugins (e.g.,String,UUID)
Implementations§
Source§impl<PluginId, Ctx, Plugins> Binding<PluginId, Ctx, Plugins>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Cardinality<PluginId, Mutex<PluginInstance<Ctx>>> + Send + Sync,
impl<PluginId, Ctx, Plugins> Binding<PluginId, Ctx, Plugins>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Cardinality<PluginId, Mutex<PluginInstance<Ctx>>> + Send + Sync,
Sourcepub fn new(
package_name: impl Into<String>,
interfaces: HashMap<String, Interface>,
plugins: Plugins,
) -> Self
pub fn new( package_name: impl Into<String>, interfaces: HashMap<String, Interface>, plugins: Plugins, ) -> Self
Creates a new binding specification.
Sourcepub fn dispatch(
&self,
interface_name: &str,
function_name: &str,
args: &[Val],
) -> Result<<<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>> as Cardinality<PluginId, Mutex<PluginInstance<Ctx>>>>::Rebind<Result<Val, DispatchError>>, DispatchError>
pub fn dispatch( &self, interface_name: &str, function_name: &str, args: &[Val], ) -> Result<<<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>> as Cardinality<PluginId, Mutex<PluginInstance<Ctx>>>>::Rebind<Result<Val, DispatchError>>, DispatchError>
Dispatches a function call to all plugins implementing this binding.
This is used for external dispatch (calling into the plugin graph from outside). The result is wrapped in a type matching the binding’s cardinality.
§Arguments
interface_name- The interface name within this binding (e.g., “example”)function_name- The function name within the interface (e.g., “get-value”)args- Arguments to pass to the function
§Returns
A cardinality wrapper containing Result<Val, DispatchError> for each plugin.
For ReturnKind::Void, the value is an empty tuple
(Val::Tuple( vec![] )) placeholder.
§Errors
Returns an error if the interface or function is not found in this binding.
Source§impl<PluginId, Ctx, Plugins> Binding<PluginId, Ctx, Plugins>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>>,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Send + Sync,
BindingAny<PluginId, Ctx>: From<Binding<PluginId, Ctx, Plugins>>,
impl<PluginId, Ctx, Plugins> Binding<PluginId, Ctx, Plugins>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>>,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Send + Sync,
BindingAny<PluginId, Ctx>: From<Binding<PluginId, Ctx, Plugins>>,
Sourcepub fn into_any(self) -> BindingAny<PluginId, Ctx>
pub fn into_any(self) -> BindingAny<PluginId, Ctx>
Converts this binding into a type-erased BindingAny for heterogeneous socket lists.
Trait Implementations§
Source§impl<PluginId, Ctx, Plugins> Clone for Binding<PluginId, Ctx, Plugins>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Send + Sync,
impl<PluginId, Ctx, Plugins> Clone for Binding<PluginId, Ctx, Plugins>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Send + Sync,
Source§impl<PluginId, Ctx, Plugins> Debug for Binding<PluginId, Ctx, Plugins>where
PluginId: Hash + Eq + Clone + Send + Sync + Debug + 'static,
Ctx: PluginContext + Debug + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Send + Sync + Debug,
impl<PluginId, Ctx, Plugins> Debug for Binding<PluginId, Ctx, Plugins>where
PluginId: Hash + Eq + Clone + Send + Sync + Debug + 'static,
Ctx: PluginContext + Debug + 'static,
Plugins: Cardinality<PluginId, PluginInstance<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: Send + Sync + Debug,
Source§impl<PluginId, Ctx> From<Binding<PluginId, Ctx>> for BindingAny<PluginId, Ctx>
impl<PluginId, Ctx> From<Binding<PluginId, Ctx>> for BindingAny<PluginId, Ctx>
Source§fn from(
binding: Binding<PluginId, Ctx, ExactlyOne<PluginId, PluginInstance<Ctx>>>,
) -> Self
fn from( binding: Binding<PluginId, Ctx, ExactlyOne<PluginId, PluginInstance<Ctx>>>, ) -> Self
Source§impl<PluginId, Ctx> From<Binding<PluginId, Ctx, Any<PluginId, PluginInstance<Ctx>>>> for BindingAny<PluginId, Ctx>
impl<PluginId, Ctx> From<Binding<PluginId, Ctx, Any<PluginId, PluginInstance<Ctx>>>> for BindingAny<PluginId, Ctx>
Source§impl<PluginId, Ctx> From<Binding<PluginId, Ctx, AtLeastOne<PluginId, PluginInstance<Ctx>>>> for BindingAny<PluginId, Ctx>
impl<PluginId, Ctx> From<Binding<PluginId, Ctx, AtLeastOne<PluginId, PluginInstance<Ctx>>>> for BindingAny<PluginId, Ctx>
Source§fn from(
binding: Binding<PluginId, Ctx, AtLeastOne<PluginId, PluginInstance<Ctx>>>,
) -> Self
fn from( binding: Binding<PluginId, Ctx, AtLeastOne<PluginId, PluginInstance<Ctx>>>, ) -> Self
Source§impl<PluginId, Ctx> From<Binding<PluginId, Ctx, AtMostOne<PluginId, PluginInstance<Ctx>>>> for BindingAny<PluginId, Ctx>
impl<PluginId, Ctx> From<Binding<PluginId, Ctx, AtMostOne<PluginId, PluginInstance<Ctx>>>> for BindingAny<PluginId, Ctx>
Auto Trait Implementations§
impl<PluginId, Ctx, Plugins> Freeze for Binding<PluginId, Ctx, Plugins>
impl<PluginId, Ctx, Plugins> RefUnwindSafe for Binding<PluginId, Ctx, Plugins>where
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: RefUnwindSafe,
impl<PluginId, Ctx, Plugins> Send for Binding<PluginId, Ctx, Plugins>
impl<PluginId, Ctx, Plugins> Sync for Binding<PluginId, Ctx, Plugins>
impl<PluginId, Ctx, Plugins> Unpin for Binding<PluginId, Ctx, Plugins>
impl<PluginId, Ctx, Plugins> UnsafeUnpin for Binding<PluginId, Ctx, Plugins>
impl<PluginId, Ctx, Plugins> UnwindSafe for Binding<PluginId, Ctx, Plugins>where
<Plugins as Cardinality<PluginId, PluginInstance<Ctx>>>::Rebind<Mutex<PluginInstance<Ctx>>>: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more