1use crate::codec::secrets::{from_wire_get_secret_response, to_wire_get_secret_request};
6use crate::generated::v1;
7use crate::rpc_support::GestaltError;
8
9#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
13#[serde(rename_all = "camelCase")]
14pub struct GetSecretRequest {
15 pub name: String,
17}
18
19#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
23#[serde(rename_all = "camelCase")]
24pub struct GetSecretResponse {
25 pub value: String,
27}
28
29pub struct Secrets {
33 inner: v1::secrets_client::SecretsClient<tonic::transport::Channel>,
34 timeout: Option<std::time::Duration>,
35}
36
37impl Secrets {
38 pub fn new(channel: tonic::transport::Channel) -> Self {
40 Self {
41 inner: v1::secrets_client::SecretsClient::new(channel),
42 timeout: None,
43 }
44 }
45
46 pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
49 self.timeout = Some(timeout);
50 self
51 }
52
53 pub async fn get_secret(&mut self, name: String) -> Result<String, GestaltError> {
55 let request = GetSecretRequest { name };
56 let mut tonic_request = tonic::Request::new(to_wire_get_secret_request(request));
57 if let Some(timeout) = self.timeout {
58 tonic_request.set_timeout(timeout);
59 }
60 let response =
61 from_wire_get_secret_response(self.inner.get_secret(tonic_request).await?.into_inner());
62 Ok(response.value)
63 }
64
65 pub async fn get_secret_raw(
67 &mut self,
68 request: GetSecretRequest,
69 ) -> Result<GetSecretResponse, GestaltError> {
70 let mut tonic_request = tonic::Request::new(to_wire_get_secret_request(request));
71 if let Some(timeout) = self.timeout {
72 tonic_request.set_timeout(timeout);
73 }
74 let response = self.inner.get_secret(tonic_request).await?;
75 Ok(from_wire_get_secret_response(response.into_inner()))
76 }
77}