wasmcloud_runtime/component/
bus.rs

1use std::sync::Arc;
2
3use anyhow::Context as _;
4use async_trait::async_trait;
5use tracing::instrument;
6use wasmcloud_core::CallTargetInterface;
7use wasmtime::component::Resource;
8
9use crate::capability::bus::lattice;
10
11use super::{Ctx, Handler, TableResult};
12
13#[async_trait]
14/// `wasmcloud:bus/lattice@2.0.0` implementation
15pub trait Bus {
16    /// Set the link name to use for a given list of interfaces, returning an error
17    /// if a link doesn't exist on the given interfaces for the given target
18    async fn set_link_name(
19        &self,
20        link_name: String,
21        interfaces: Vec<Arc<CallTargetInterface>>,
22    ) -> anyhow::Result<Result<(), String>>;
23}
24
25#[async_trait]
26impl<H: Handler> lattice::Host for Ctx<H> {
27    #[instrument(level = "debug", skip_all)]
28    async fn set_link_name(
29        &mut self,
30        link_name: String,
31        interfaces: Vec<Resource<Arc<CallTargetInterface>>>,
32    ) -> anyhow::Result<Result<(), String>> {
33        self.attach_parent_context();
34        let interfaces = interfaces
35            .into_iter()
36            .map(|interface| self.table.get(&interface).cloned())
37            .collect::<TableResult<_>>()
38            .context("failed to convert call target interfaces")?;
39        self.handler
40            .set_link_name(link_name, interfaces)
41            .await
42            .context("failed to set link name")
43    }
44}
45
46#[async_trait]
47impl<H: Handler> lattice::HostCallTargetInterface for Ctx<H> {
48    #[instrument(level = "debug", skip_all)]
49    async fn new(
50        &mut self,
51        namespace: String,
52        package: String,
53        interface: String,
54    ) -> anyhow::Result<Resource<Arc<CallTargetInterface>>> {
55        self.attach_parent_context();
56        self.table
57            .push(Arc::new(CallTargetInterface {
58                namespace,
59                package,
60                interface,
61            }))
62            .context("failed to push target interface")
63    }
64
65    async fn drop(&mut self, interface: Resource<Arc<CallTargetInterface>>) -> anyhow::Result<()> {
66        self.table.delete(interface)?;
67        Ok(())
68    }
69}