Skip to content

Commit 6bbd7b5

Browse files
committed
refactor(server): refactor env to advanced trait
1 parent 0df38b3 commit 6bbd7b5

File tree

2 files changed

+51
-33
lines changed

2 files changed

+51
-33
lines changed

server/src/bin/server.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use log::info;
55

66
use server::amqp::{establish_connection_with_rabbit, Publisher};
77
use server::dispatch_consumer::consume;
8-
use server::env::env_with_default;
8+
use server::env::{Env, EnvVar};
99
use server::logs::init_log;
1010
use server::routes::routes;
1111
use server::storage::Storage;
@@ -16,7 +16,7 @@ async fn main() -> std::io::Result<()> {
1616
init_log();
1717

1818
let ip = "127.0.0.1";
19-
let port: u16 = env_with_default("SERVER_PORT", 8090);
19+
let port: u16 = Env::env_or("SERVER_PORT", 8090);
2020

2121
let storage = Data::new(Storage::new());
2222
let channel = establish_connection_with_rabbit().await;

server/src/env.rs

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,89 @@
11
use std::env;
22
use std::env::VarError;
3-
use std::fmt::Debug;
4-
use std::str::FromStr;
5-
6-
pub fn env<T>(key: &str) -> T
7-
where
8-
T: Debug + FromStr,
9-
<T as FromStr>::Err: Debug,
10-
{
11-
get_env(key)
12-
.unwrap_or_else(|_| panic!("env {} is not configured", key))
13-
.parse()
14-
.unwrap()
3+
4+
pub trait EnvVar<T> {
5+
fn env(key: &str) -> T;
6+
7+
fn env_or(key: &str, default: T) -> T;
8+
}
9+
10+
pub struct Env {}
11+
12+
impl Env {
13+
fn get_env(key: &str) -> Result<String, VarError> {
14+
env::var(key)
15+
}
1516
}
1617

17-
pub fn env_with_default<T>(key: &str, default: T) -> T
18-
where
19-
T: Debug + FromStr,
20-
<T as FromStr>::Err: Debug,
21-
{
22-
if let Ok(var) = get_env(key) {
23-
return var.parse().unwrap();
18+
impl EnvVar<String> for Env {
19+
fn env(key: &str) -> String {
20+
Self::get_env(key).unwrap_or_else(|_| panic!("env {} is not configured", key))
2421
}
2522

26-
default
23+
fn env_or(key: &str, default: String) -> String {
24+
Self::get_env(key).unwrap_or(default)
25+
}
2726
}
2827

29-
fn get_env(key: &str) -> Result<String, VarError> {
30-
env::var(key)
28+
impl EnvVar<usize> for Env {
29+
fn env(key: &str) -> usize {
30+
<Self as EnvVar<String>>::env(key).parse().unwrap()
31+
}
32+
33+
fn env_or(key: &str, default: usize) -> usize {
34+
match Self::get_env(key) {
35+
Ok(var) => var.parse().unwrap(),
36+
Err(_) => default,
37+
}
38+
}
39+
}
40+
41+
impl EnvVar<u16> for Env {
42+
fn env(key: &str) -> u16 {
43+
<Self as EnvVar<usize>>::env(key) as u16
44+
}
45+
46+
fn env_or(key: &str, default: u16) -> u16 {
47+
<Self as EnvVar<usize>>::env_or(key, default as usize) as u16
48+
}
3149
}
3250

3351
#[cfg(test)]
3452
mod tests {
3553
use temp_env::{with_var, with_var_unset};
3654

37-
use crate::env::{env, env_with_default};
55+
use crate::env::{Env, EnvVar};
3856

3957
#[test]
4058
fn env_with_default_env_is_set() {
4159
with_var("TEST_STRING", Some("FOO"), || {
42-
assert_eq!("FOO", env_with_default("TEST_STRING", "BAR".to_string()));
60+
assert_eq!("FOO", Env::env_or("TEST_STRING", "BAR".to_string()));
4361
});
4462

4563
with_var("TEST_INT", Some("123"), || {
46-
let var: i32 = env_with_default("TEST_INT", 456);
64+
let var: usize = Env::env_or("TEST_INT", 456);
4765
assert_eq!(123, var);
4866
});
4967
}
5068

5169
#[test]
5270
fn env_with_default_env_is_not_set_then_pick_default() {
53-
assert_eq!("BAR", env_with_default("TEST_STRING", "BAR".to_string()));
71+
assert_eq!("BAR", Env::env_or("TEST_STRING", "BAR".to_string()));
5472

55-
let var: i32 = env_with_default("TEST_INT", 456);
73+
let var: usize = Env::env_or("TEST_INT", 456);
5674
assert_eq!(456, var);
5775
}
5876

5977
#[test]
6078
fn env_when_env_is_set() {
6179
with_var("TEST_STRING", Some("FOO"), || {
62-
let var: String = env("TEST_STRING");
80+
let var: String = Env::env("TEST_STRING");
6381

6482
assert_eq!(String::from("FOO"), var);
6583
});
6684

6785
with_var("TEST_INT", Some("132"), || {
68-
let var: i32 = env("TEST_INT");
86+
let var: usize = Env::env("TEST_INT");
6987

7088
assert_eq!(132, var);
7189
});
@@ -75,15 +93,15 @@ mod tests {
7593
#[should_panic(expected = "env TEST_STRING is not configured")]
7694
fn env_without_string_env() {
7795
with_var_unset("TEST_STRING", || {
78-
let _: String = env("TEST_STRING");
96+
let _: String = Env::env("TEST_STRING");
7997
})
8098
}
8199

82100
#[test]
83101
#[should_panic(expected = "env TEST_INT is not configured")]
84102
fn env_without_int_env() {
85103
with_var_unset("TEST_INT", || {
86-
let _: u32 = env("TEST_INT");
104+
let _: usize = Env::env("TEST_INT");
87105
})
88106
}
89107
}

0 commit comments

Comments
 (0)