Skip to content

Commit b8d53a3

Browse files
committed
fixup
- Add comments - Rename `Config` to `TomlConfigTable` - Delete the macros, replace them with inlined functions
1 parent 1c1500f commit b8d53a3

File tree

2 files changed

+46
-46
lines changed

2 files changed

+46
-46
lines changed

rust/server/src/util/config.rs

Lines changed: 45 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ const PSQL_VSS_DB_VAR: &str = "VSS_PSQL_VSS_DB";
1111
const PSQL_TLS_VAR: &str = "VSS_PSQL_TLS";
1212
const PSQL_CERT_PEM_VAR: &str = "VSS_PSQL_CRT_PEM";
1313

14+
// The structure of the toml config file. Any settings specified therein can be overriden by the corresponding
15+
// environment variable.
1416
#[derive(Deserialize, Default)]
15-
struct Config {
17+
struct TomlConfigTable {
1618
server_config: Option<ServerConfig>,
1719
jwt_auth_config: Option<JwtAuthConfig>,
1820
postgresql_config: Option<PostgreSQLConfig>,
@@ -43,6 +45,7 @@ struct TlsConfig {
4345
crt_pem: Option<String>,
4446
}
4547

48+
// Encapsulates the result of reading both the environment variables and the config file.
4649
pub(crate) struct Configuration {
4750
pub(crate) bind_address: SocketAddr,
4851
pub(crate) rsa_pem: Option<String>,
@@ -52,8 +55,28 @@ pub(crate) struct Configuration {
5255
pub(crate) tls_config: Option<Option<String>>,
5356
}
5457

58+
#[inline]
59+
fn read_env(env_var: &str) -> Result<Option<String>, String> {
60+
match std::env::var(env_var) {
61+
Ok(env) => Ok(Some(env)),
62+
Err(std::env::VarError::NotPresent) => Ok(None),
63+
Err(e) => Err(format!("Failed to load the {} environment variable: {}", env_var, e)),
64+
}
65+
}
66+
67+
#[inline]
68+
fn read_config<'a, T: std::fmt::Display>(
69+
env: Option<T>, config: Option<T>, item: &str, var_name: &str,
70+
) -> Result<T, String> {
71+
env.or(config).ok_or(format!(
72+
"{} must be provided in the configuration file or the environment variable {} must be set.",
73+
item, var_name
74+
))
75+
}
76+
5577
pub(crate) fn load_configuration(config_file_path: Option<&str>) -> Result<Configuration, String> {
56-
let Config { server_config, jwt_auth_config, postgresql_config } = if config_file_path.is_some()
78+
let TomlConfigTable { server_config, jwt_auth_config, postgresql_config } = if config_file_path
79+
.is_some()
5780
&& std::fs::exists(config_file_path.expect("config file path is some"))
5881
.map_err(|e| format!("Failed to check presence of configuration file: {}", e))?
5982
{
@@ -63,63 +86,39 @@ pub(crate) fn load_configuration(config_file_path: Option<&str>) -> Result<Confi
6386
toml::from_str(&config_file)
6487
.map_err(|e| format!("Failed to parse configuration file: {}", e))?
6588
} else {
66-
Config::default() // All fields are set to `None`
89+
TomlConfigTable::default() // All fields are set to `None`
6790
};
6891

69-
macro_rules! read_env {
70-
($env_var:expr) => {
71-
match std::env::var($env_var) {
72-
Ok(env) => Some(env),
73-
Err(std::env::VarError::NotPresent) => None,
74-
Err(e) => {
75-
return Err(format!(
76-
"Failed to load the {} environment variable: {}",
77-
$env_var, e
78-
))
79-
},
80-
}
81-
};
82-
}
83-
84-
macro_rules! read_config {
85-
($env:expr, $config: expr, $item: expr, $var_name: expr) => {
86-
$env.or($config).ok_or(format!(
87-
"{} must be provided in the configuration file or the environment variable {} must be set.",
88-
$item, $var_name
89-
))?
90-
};
91-
}
92-
93-
let bind_address_env = read_env!(BIND_ADDR_VAR)
92+
let bind_address_env = read_env(BIND_ADDR_VAR)?
9493
.map(|addr| {
9594
addr.parse().map_err(|e| {
9695
format!("Unable to parse the bind address environment variable: {}", e)
9796
})
9897
})
9998
.transpose()?;
100-
let bind_address = read_config!(
99+
let bind_address = read_config(
101100
bind_address_env,
102101
server_config.and_then(|c| c.bind_address),
103102
"VSS server bind address",
104-
BIND_ADDR_VAR
105-
);
103+
BIND_ADDR_VAR,
104+
)?;
106105

107-
let rsa_pem_env = read_env!(JWT_RSA_PEM_VAR);
106+
let rsa_pem_env = read_env(JWT_RSA_PEM_VAR)?;
108107
let rsa_pem = rsa_pem_env.or(jwt_auth_config.and_then(|config| config.rsa_pem));
109108

110-
let username_env = read_env!(PSQL_USER_VAR);
111-
let password_env = read_env!(PSQL_PASS_VAR);
112-
let address_env: Option<SocketAddr> = read_env!(PSQL_ADDR_VAR)
109+
let username_env = read_env(PSQL_USER_VAR)?;
110+
let password_env = read_env(PSQL_PASS_VAR)?;
111+
let address_env: Option<SocketAddr> = read_env(PSQL_ADDR_VAR)?
113112
.map(|address| {
114113
address.parse().map_err(|e| {
115114
format!("Unable to parse the postgresql address environment variable: {}", e)
116115
})
117116
})
118117
.transpose()?;
119-
let default_db_env = read_env!(PSQL_DB_VAR);
120-
let vss_db_env = read_env!(PSQL_VSS_DB_VAR);
121-
let tls_config_env = read_env!(PSQL_TLS_VAR);
122-
let crt_pem_env = read_env!(PSQL_CERT_PEM_VAR);
118+
let default_db_env = read_env(PSQL_DB_VAR)?;
119+
let vss_db_env = read_env(PSQL_VSS_DB_VAR)?;
120+
let tls_config_env = read_env(PSQL_TLS_VAR)?;
121+
let crt_pem_env = read_env(PSQL_CERT_PEM_VAR)?;
123122

124123
let (
125124
username_config,
@@ -141,19 +140,19 @@ pub(crate) fn load_configuration(config_file_path: Option<&str>) -> Result<Confi
141140
};
142141

143142
let username =
144-
read_config!(username_env, username_config, "PostgreSQL database username", PSQL_USER_VAR);
143+
read_config(username_env, username_config, "PostgreSQL database username", PSQL_USER_VAR)?;
145144
let password =
146-
read_config!(password_env, password_config, "PostgreSQL database password", PSQL_PASS_VAR);
145+
read_config(password_env, password_config, "PostgreSQL database password", PSQL_PASS_VAR)?;
147146
let address =
148-
read_config!(address_env, address_config, "PostgreSQL service address", PSQL_ADDR_VAR);
149-
let default_db = read_config!(
147+
read_config(address_env, address_config, "PostgreSQL service address", PSQL_ADDR_VAR)?;
148+
let default_db = read_config(
150149
default_db_env,
151150
default_db_config,
152151
"PostgreSQL default database name",
153-
PSQL_DB_VAR
154-
);
152+
PSQL_DB_VAR,
153+
)?;
155154
let vss_db =
156-
read_config!(vss_db_env, vss_db_config, "PostgreSQL vss database name", PSQL_VSS_DB_VAR);
155+
read_config(vss_db_env, vss_db_config, "PostgreSQL vss database name", PSQL_VSS_DB_VAR)?;
157156

158157
let tls_config =
159158
crt_pem_env.map(|pem| Some(pem)).or(tls_config_env.map(|_| None)).or(tls_config);

rust/server/vss-server-config.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ bind_address = "127.0.0.1:8080" # Optional in TOML, can be overridden by env var
1313
username = "postgres" # Optional in TOML, can be overridden by env var `VSS_PSQL_USERNAME`
1414
password = "postgres" # Optional in TOML, can be overridden by env var `VSS_PSQL_PASSWORD`
1515
address = "127.0.0.1:5432" # Optional in TOML, can be overridden by env var `VSS_PSQL_ADDRESS`
16+
# We first connect to `default_database` to create `vss_database` if it does not exist
1617
default_database = "postgres" # Optional in TOML, can be overridden by env var `VSS_PSQL_DEFAULT_DB`
1718
vss_database = "vss" # Optional in TOML, can be overridden by env var `VSS_PSQL_VSS_DB`
1819

0 commit comments

Comments
 (0)