wasmcloud_runtime/component/
bus.rs1use 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]
14pub trait Bus {
16 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}