@@ -11,8 +11,10 @@ const PSQL_VSS_DB_VAR: &str = "VSS_PSQL_VSS_DB";
1111const PSQL_TLS_VAR : & str = "VSS_PSQL_TLS" ;
1212const 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.
4649pub ( 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+
5577pub ( 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) ;
0 commit comments