wasmcloud_runtime/component/
secrets.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use tracing::instrument;
5use wasmtime::component::Resource;
6
7use crate::capability::secrets::store::{HostSecret, Secret, SecretValue};
8use crate::capability::secrets::{self, reveal, store};
9
10use super::{Ctx, Handler};
11
12/// `wasmcloud:secrets` implementation
13#[async_trait]
14pub trait Secrets {
15    /// Handle `wasmcloud:secrets/store.get`
16    async fn get(
17        &self,
18        key: &str,
19    ) -> anyhow::Result<Result<secrets::store::Secret, secrets::store::SecretsError>>;
20
21    /// Handle `wasmcloud:secrets/reveal.reveal`
22    async fn reveal(
23        &self,
24        secret: secrets::reveal::Secret,
25    ) -> anyhow::Result<secrets::reveal::SecretValue>;
26}
27
28#[async_trait]
29impl<H: Handler> HostSecret for Ctx<H> {
30    async fn drop(&mut self, secret: Resource<Secret>) -> anyhow::Result<()> {
31        self.table.delete(secret)?;
32        Ok(())
33    }
34}
35
36#[async_trait]
37impl<H: Handler> store::Host for Ctx<H> {
38    #[instrument(skip(self))]
39    async fn get(
40        &mut self,
41        key: String,
42    ) -> anyhow::Result<Result<Resource<Secret>, store::SecretsError>> {
43        self.attach_parent_context();
44        let secret = Secrets::get(&self.handler, &key).await?;
45        if let Some(err) = secret.err() {
46            Ok(Err(err))
47        } else {
48            let secret_resource = self.table.push(Arc::new(key))?;
49            Ok(Ok(secret_resource))
50        }
51    }
52}
53
54#[async_trait]
55impl<H: Handler> reveal::Host for Ctx<H> {
56    #[instrument(skip(self))]
57    async fn reveal(&mut self, secret: Resource<Secret>) -> anyhow::Result<SecretValue> {
58        self.attach_parent_context();
59        let key = self.table.get(&secret)?;
60        let secret_value = self.handler.reveal(key.clone()).await?;
61        Ok(secret_value)
62    }
63}