pub struct Binding<PluginId, Ctx, Plugins = ExactlyOne<PluginId, PluginInstanceSync<Ctx>>, Instance = PluginInstanceSync<Ctx>>(/* private fields */)
where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Instance: Send + 'static,
Plugins: Cardinality<PluginId, Instance> + 'static,
<Plugins as Cardinality<PluginId, Instance>>::Rebind<Arc<Mutex<Instance>>>: 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)Ctx: Context stored in each plugin’s Wasmtime storePlugins: Cardinality wrapper containing the plugin instancesInstance:PluginInstanceSyncorPluginInstanceAsync
Implementations§
Source§impl<PluginId, Ctx, Plugins, Instance> Binding<PluginId, Ctx, Plugins, Instance>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Instance: Send + 'static,
Plugins: Cardinality<PluginId, Instance> + 'static,
<Plugins as Cardinality<PluginId, Instance>>::Rebind<Arc<Mutex<Instance>>>: Cardinality<PluginId, Arc<Mutex<Instance>>> + Send + Sync,
impl<PluginId, Ctx, Plugins, Instance> Binding<PluginId, Ctx, Plugins, Instance>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Instance: Send + 'static,
Plugins: Cardinality<PluginId, Instance> + 'static,
<Plugins as Cardinality<PluginId, Instance>>::Rebind<Arc<Mutex<Instance>>>: Cardinality<PluginId, Arc<Mutex<Instance>>> + Send + Sync,
Source§impl<PluginId, Ctx, Plugins> Binding<PluginId, Ctx, Plugins, PluginInstanceSync<Ctx>>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstanceSync<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstanceSync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceSync<Ctx>>>>: Cardinality<PluginId, Arc<Mutex<PluginInstanceSync<Ctx>>>> + Send + Sync,
impl<PluginId, Ctx, Plugins> Binding<PluginId, Ctx, Plugins, PluginInstanceSync<Ctx>>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstanceSync<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstanceSync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceSync<Ctx>>>>: Cardinality<PluginId, Arc<Mutex<PluginInstanceSync<Ctx>>>> + Send + Sync,
Sourcepub fn dispatch(
&self,
interface_name: &str,
function_name: &str,
args: &[Val],
) -> Result<<<Plugins as Cardinality<PluginId, PluginInstanceSync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceSync<Ctx>>>> as Cardinality<PluginId, Arc<Mutex<PluginInstanceSync<Ctx>>>>>::Rebind<Result<Val, DispatchError>>, DispatchError>
pub fn dispatch( &self, interface_name: &str, function_name: &str, args: &[Val], ) -> Result<<<Plugins as Cardinality<PluginId, PluginInstanceSync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceSync<Ctx>>>> as Cardinality<PluginId, Arc<Mutex<PluginInstanceSync<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::Option( None )) 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, PluginInstanceAsync<Ctx>>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstanceAsync<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstanceAsync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceAsync<Ctx>>>>: Cardinality<PluginId, Arc<Mutex<PluginInstanceAsync<Ctx>>>> + Send + Sync,
impl<PluginId, Ctx, Plugins> Binding<PluginId, Ctx, Plugins, PluginInstanceAsync<Ctx>>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Plugins: Cardinality<PluginId, PluginInstanceAsync<Ctx>> + 'static,
<Plugins as Cardinality<PluginId, PluginInstanceAsync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceAsync<Ctx>>>>: Cardinality<PluginId, Arc<Mutex<PluginInstanceAsync<Ctx>>>> + Send + Sync,
Sourcepub async fn dispatch_async(
&self,
interface_name: &str,
function_name: &str,
args: &[Val],
) -> Result<<<Plugins as Cardinality<PluginId, PluginInstanceAsync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceAsync<Ctx>>>> as Cardinality<PluginId, Arc<Mutex<PluginInstanceAsync<Ctx>>>>>::Rebind<Result<Val, DispatchError>>, DispatchError>where
PluginId: Into<Val>,
<<Plugins as Cardinality<PluginId, PluginInstanceAsync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceAsync<Ctx>>>> as Cardinality<PluginId, Arc<Mutex<PluginInstanceAsync<Ctx>>>>>::Rebind<Result<Val, DispatchError>>: Send,
pub async fn dispatch_async(
&self,
interface_name: &str,
function_name: &str,
args: &[Val],
) -> Result<<<Plugins as Cardinality<PluginId, PluginInstanceAsync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceAsync<Ctx>>>> as Cardinality<PluginId, Arc<Mutex<PluginInstanceAsync<Ctx>>>>>::Rebind<Result<Val, DispatchError>>, DispatchError>where
PluginId: Into<Val>,
<<Plugins as Cardinality<PluginId, PluginInstanceAsync<Ctx>>>::Rebind<Arc<Mutex<PluginInstanceAsync<Ctx>>>> as Cardinality<PluginId, Arc<Mutex<PluginInstanceAsync<Ctx>>>>>::Rebind<Result<Val, DispatchError>>: Send,
Asynchronously dispatches a function call to all plugins implementing this binding.
This method waits for a busy plugin instead of returning DispatchError::LockRejected.
It is required for instances created by Plugin::instantiate_async
or Plugin::link_async.
§Example
let result = binding.dispatch_async( "root", "get", &[] ).await?;
assert!( matches!( result, ExactlyOne( _, Ok( Val::U32( 42 )))));§Errors
Returns an error if the interface or function is not found in this binding.
Source§impl<PluginId, Ctx, Plugins, Instance> Binding<PluginId, Ctx, Plugins, Instance>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Instance: Send + 'static,
Plugins: Cardinality<PluginId, Instance>,
<Plugins as Cardinality<PluginId, Instance>>::Rebind<Arc<Mutex<Instance>>>: Send + Sync,
BindingAny<PluginId, Ctx, Instance>: From<Binding<PluginId, Ctx, Plugins, Instance>>,
impl<PluginId, Ctx, Plugins, Instance> Binding<PluginId, Ctx, Plugins, Instance>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Instance: Send + 'static,
Plugins: Cardinality<PluginId, Instance>,
<Plugins as Cardinality<PluginId, Instance>>::Rebind<Arc<Mutex<Instance>>>: Send + Sync,
BindingAny<PluginId, Ctx, Instance>: From<Binding<PluginId, Ctx, Plugins, Instance>>,
Sourcepub fn into_any(self) -> BindingAny<PluginId, Ctx, Instance>
pub fn into_any(self) -> BindingAny<PluginId, Ctx, Instance>
Converts this binding into a type-erased BindingAny for heterogeneous socket lists.
Trait Implementations§
Source§impl<PluginId, Ctx, Plugins, Instance> Clone for Binding<PluginId, Ctx, Plugins, Instance>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Instance: Send + 'static,
Plugins: Cardinality<PluginId, Instance> + 'static,
<Plugins as Cardinality<PluginId, Instance>>::Rebind<Arc<Mutex<Instance>>>: Send + Sync,
impl<PluginId, Ctx, Plugins, Instance> Clone for Binding<PluginId, Ctx, Plugins, Instance>where
PluginId: Hash + Eq + Clone + Send + Sync + 'static,
Ctx: PluginContext + 'static,
Instance: Send + 'static,
Plugins: Cardinality<PluginId, Instance> + 'static,
<Plugins as Cardinality<PluginId, Instance>>::Rebind<Arc<Mutex<Instance>>>: Send + Sync,
Source§impl<PluginId, Ctx, Instance> From<Binding<PluginId, Ctx, Any<PluginId, Instance>, Instance>> for BindingAny<PluginId, Ctx, Instance>
impl<PluginId, Ctx, Instance> From<Binding<PluginId, Ctx, Any<PluginId, Instance>, Instance>> for BindingAny<PluginId, Ctx, Instance>
Source§impl<PluginId, Ctx, Instance> From<Binding<PluginId, Ctx, AtLeastOne<PluginId, Instance>, Instance>> for BindingAny<PluginId, Ctx, Instance>
impl<PluginId, Ctx, Instance> From<Binding<PluginId, Ctx, AtLeastOne<PluginId, Instance>, Instance>> for BindingAny<PluginId, Ctx, Instance>
Source§fn from(
binding: Binding<PluginId, Ctx, AtLeastOne<PluginId, Instance>, Instance>,
) -> Self
fn from( binding: Binding<PluginId, Ctx, AtLeastOne<PluginId, Instance>, Instance>, ) -> Self
Source§impl<PluginId, Ctx, Instance> From<Binding<PluginId, Ctx, AtMostOne<PluginId, Instance>, Instance>> for BindingAny<PluginId, Ctx, Instance>
impl<PluginId, Ctx, Instance> From<Binding<PluginId, Ctx, AtMostOne<PluginId, Instance>, Instance>> for BindingAny<PluginId, Ctx, Instance>
Source§impl<PluginId, Ctx, Instance> From<Binding<PluginId, Ctx, ExactlyOne<PluginId, Instance>, Instance>> for BindingAny<PluginId, Ctx, Instance>
impl<PluginId, Ctx, Instance> From<Binding<PluginId, Ctx, ExactlyOne<PluginId, Instance>, Instance>> for BindingAny<PluginId, Ctx, Instance>
Source§fn from(
binding: Binding<PluginId, Ctx, ExactlyOne<PluginId, Instance>, Instance>,
) -> Self
fn from( binding: Binding<PluginId, Ctx, ExactlyOne<PluginId, Instance>, Instance>, ) -> Self
Auto Trait Implementations§
impl<PluginId, Ctx, Plugins, Instance> Freeze for Binding<PluginId, Ctx, Plugins, Instance>
impl<PluginId, Ctx, Plugins, Instance> RefUnwindSafe for Binding<PluginId, Ctx, Plugins, Instance>
impl<PluginId, Ctx, Plugins, Instance> Send for Binding<PluginId, Ctx, Plugins, Instance>
impl<PluginId, Ctx, Plugins, Instance> Sync for Binding<PluginId, Ctx, Plugins, Instance>
impl<PluginId, Ctx, Plugins, Instance> Unpin for Binding<PluginId, Ctx, Plugins, Instance>
impl<PluginId, Ctx, Plugins, Instance> UnsafeUnpin for Binding<PluginId, Ctx, Plugins, Instance>
impl<PluginId, Ctx, Plugins, Instance> UnwindSafe for Binding<PluginId, Ctx, Plugins, Instance>
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