alien_bindings/providers/vault/
grpc.rs1use crate::{
2 error::Error,
3 grpc::status_conversion::status_to_alien_error,
4 grpc::vault_service::alien_bindings::vault::{
5 vault_service_client::VaultServiceClient, DeleteSecretRequest, GetSecretRequest,
6 SetSecretRequest,
7 },
8 traits::{Binding, Vault},
9};
10
11use async_trait::async_trait;
12use tonic::{transport::Channel, Request};
13
14#[derive(Debug)]
19pub struct GrpcVault {
20 client: VaultServiceClient<Channel>,
21 binding_name: String,
22}
23
24impl GrpcVault {
25 pub async fn new(binding_name: String, grpc_address: String) -> Result<Self, Error> {
27 let channel = crate::providers::grpc_provider::create_grpc_channel(grpc_address).await?;
28 Self::new_from_channel(channel, binding_name).await
29 }
30
31 pub async fn new_from_channel(channel: Channel, binding_name: String) -> Result<Self, Error> {
33 let client = VaultServiceClient::new(channel);
34
35 Ok(Self {
36 client,
37 binding_name,
38 })
39 }
40
41 fn client(&self) -> VaultServiceClient<Channel> {
42 self.client.clone()
43 }
44}
45
46impl Binding for GrpcVault {}
47
48#[async_trait]
49impl Vault for GrpcVault {
50 async fn get_secret(&self, secret_name: &str) -> Result<String, Error> {
51 let mut client = self.client();
52
53 let request = GetSecretRequest {
54 binding_name: self.binding_name.clone(),
55 secret_name: secret_name.to_string(),
56 };
57
58 let response = client
59 .get_secret(Request::new(request))
60 .await
61 .map_err(|e| status_to_alien_error(e, "get_secret"))?
62 .into_inner();
63
64 Ok(response.value)
65 }
66
67 async fn set_secret(&self, secret_name: &str, value: &str) -> Result<(), Error> {
68 let mut client = self.client();
69
70 let request = SetSecretRequest {
71 binding_name: self.binding_name.clone(),
72 secret_name: secret_name.to_string(),
73 value: value.to_string(),
74 };
75
76 client
77 .set_secret(Request::new(request))
78 .await
79 .map_err(|e| status_to_alien_error(e, "set_secret"))?;
80
81 Ok(())
82 }
83
84 async fn delete_secret(&self, secret_name: &str) -> Result<(), Error> {
85 let mut client = self.client();
86
87 let request = DeleteSecretRequest {
88 binding_name: self.binding_name.clone(),
89 secret_name: secret_name.to_string(),
90 };
91
92 client
93 .delete_secret(Request::new(request))
94 .await
95 .map_err(|e| status_to_alien_error(e, "delete_secret"))?;
96
97 Ok(())
98 }
99}