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
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}