wasmcloud_runtime/component/
secrets.rs1use 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#[async_trait]
14pub trait Secrets {
15 async fn get(
17 &self,
18 key: &str,
19 ) -> anyhow::Result<Result<secrets::store::Secret, secrets::store::SecretsError>>;
20
21 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}