Skip to content

Commit 59ebf90

Browse files
committed
feat: Add support to parse a SecretStore to a struct using the config crate
1 parent f41afde commit 59ebf90

File tree

5 files changed

+222
-1
lines changed

5 files changed

+222
-1
lines changed

Cargo.lock

+190-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ url = { workspace = true, features = ["serde"] }
5050
uuid = { workspace = true, features = ["v4", "serde"], optional = true }
5151
zeroize = { workspace = true }
5252
wiremock = { workspace = true, optional = true }
53+
config = { version = "0.14.0", optional = true }
5354

5455
[features]
5556
backend = [
@@ -101,6 +102,7 @@ sqlx = ["dep:sqlx", "sqlx/sqlite"]
101102
service = ["chrono/serde", "display", "tracing", "tracing-subscriber", "uuid"]
102103
test-utils = ["wiremock"]
103104
tracing = ["dep:tracing"]
105+
config = ["dep:config"]
104106

105107
[dev-dependencies]
106108
axum = { workspace = true }

common/src/secrets.rs

+26
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
#[cfg(config)]
2+
use serde::de::DeserializeOwned;
13
use serde::{Deserialize, Serialize};
4+
#[cfg(config)]
5+
use std::collections::HashMap;
26
use std::{collections::BTreeMap, fmt::Debug};
37
use zeroize::Zeroize;
48

@@ -78,6 +82,28 @@ impl IntoIterator for SecretStore {
7882
}
7983
}
8084

85+
#[cfg(config)]
86+
impl SecretStore {
87+
pub fn deserialize(self) -> T
88+
where
89+
T: DeserializeOwned,
90+
{
91+
let secrets = self.into_iter().collect::<HashMap<_, _>>();
92+
93+
config::Config::builder()
94+
.add_source(
95+
config::Environment::default()
96+
.source(Some(secrets))
97+
.try_parsing(true)
98+
.separator("__"),
99+
)
100+
.build()
101+
.expect("Failed to load app configuration")
102+
.try_deserialize()
103+
.expect("Cannot deserialize configuration")
104+
}
105+
}
106+
81107
#[cfg(test)]
82108
#[allow(dead_code)]
83109
mod secrets_tests {

resources/secrets/Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ license = "Apache-2.0"
66
description = "Plugin to for managing secrets on shuttle"
77
keywords = ["shuttle-service", "secrets"]
88

9+
[features]
10+
config = ["shuttle-service/config"]
11+
912
[dependencies]
1013
async-trait = "0.1.56"
1114
serde_json = "1"

service/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,4 @@ builder = [
4444
"tracing",
4545
]
4646
runner = ["shuttle-proto/runtime-client", "tokio/process", "dunce"]
47+
config = ["shuttle-common/config"]

0 commit comments

Comments
 (0)