use std::sync::Arc;
use anyhow::Context as _;
use tracing::instrument;
use wasmcloud_core::{link_del_subject, link_put_subject};
use wasmcloud_tracing::context::TraceContextInjector;
use crate::wasmbus::{injector_to_headers, providers::ProviderManager};
pub struct NatsProviderManager {
pub(crate) nats_client: Arc<async_nats::Client>,
pub(crate) lattice: String,
}
impl NatsProviderManager {
pub fn new(nats_client: Arc<async_nats::Client>, lattice: String) -> Self {
Self {
nats_client,
lattice,
}
}
}
#[async_trait::async_trait]
impl ProviderManager for NatsProviderManager {
#[instrument(level = "debug", skip(self))]
async fn put_link(
&self,
link: &wasmcloud_core::InterfaceLinkDefinition,
target: &str,
) -> anyhow::Result<()> {
let lattice = &self.lattice;
let payload =
serde_json::to_vec(link).context("failed to serialize provider link definition")?;
self.nats_client
.publish_with_headers(
link_put_subject(lattice, target),
injector_to_headers(&TraceContextInjector::default_with_span()),
payload.into(),
)
.await
.context("failed to publish provider link definition")?;
Ok(())
}
#[instrument(level = "debug", skip(self))]
async fn delete_link(
&self,
link: &wasmcloud_core::InterfaceLinkDefinition,
target: &str,
) -> anyhow::Result<()> {
let lattice = &self.lattice;
let payload =
serde_json::to_vec(link).context("failed to serialize provider link definition")?;
self.nats_client
.publish_with_headers(
link_del_subject(lattice, target),
injector_to_headers(&TraceContextInjector::default_with_span()),
payload.into(),
)
.await
.context("failed to publish provider link definition")?;
Ok(())
}
}