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
28impl<H: Handler> HostSecret for Ctx<H> {
29    async fn drop(&mut self, secret: Resource<Secret>) -> anyhow::Result<()> {
30        self.table.delete(secret)?;
31        Ok(())
32    }
33}
34
35impl<H: Handler> store::Host for Ctx<H> {
36    #[instrument(skip(self))]
37    async fn get(
38        &mut self,
39        key: String,
40    ) -> anyhow::Result<Result<Resource<Secret>, store::SecretsError>> {
41        self.attach_parent_context();
42        let secret = Secrets::get(&self.handler, &key).await?;
43        if let Some(err) = secret.err() {
44            Ok(Err(err))
45        } else {
46            let secret_resource = self.table.push(Arc::new(key))?;
47            Ok(Ok(secret_resource))
48        }
49    }
50}
51
52impl<H: Handler> reveal::Host for Ctx<H> {
53    #[instrument(skip(self))]
54    async fn reveal(&mut self, secret: Resource<Secret>) -> anyhow::Result<SecretValue> {
55        self.attach_parent_context();
56        let key = self.table.get(&secret)?;
57        let secret_value = self.handler.reveal(key.clone()).await?;
58        Ok(secret_value)
59    }
60}