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