-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp_config.rs
126 lines (113 loc) · 4.55 KB
/
app_config.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use std::env;
use std::sync::OnceLock;
use std::time::Duration;
use super::error::ServerError;
const DEFAULT_SERVER_REQUEST_TIMEOUT: u64 = 15;
const DEFAULT_SERVER_HOST: &str = "0.0.0.0";
const DEFAULT_SERVER_PORT: u16 = 8080;
const DEFAULT_SERVER_FILE_UPLOAD_MAX_SIZE: usize = 1024 * 1024 * 10;
const DEFAULT_SERVER_ENVIRONMENT: &str = "development";
const DEFAULT_SERVICE_NAME: &str = "ocr-service";
const DEFAULT_MAX_ACCESS_CONTROL_AGE: u64 = 600;
pub fn app_config() -> &'static AppConfig {
static INSTANCE: OnceLock<AppConfig> = OnceLock::new();
INSTANCE.get_or_init(|| {
AppConfig::load_from_env()
.unwrap_or_else(|ex| panic!("Unable to load application configuration: {ex:?}"))
})
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AppConfig {
pub server: ServerConfig,
pub service: ServiceConfig,
pub security: SecurityConfig,
pub otel: OtelConfig,
pub otel_provider: OtelProviderConfig,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ServerConfig {
pub host: String,
pub port: u16,
pub file_upload_max_size: usize,
pub environment: String,
pub timeout: Duration,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SecurityConfig {
pub max_access_control_age: Duration,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ServiceConfig {
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OtelProviderConfig {
pub provider: Option<String>,
pub organization: Option<String>,
pub stream_name: Option<String>,
pub auth_token: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OtelConfig {
pub enabled: bool,
pub service_name: Option<String>,
pub traces_endpoint: Option<String>,
pub logs_endpoint: Option<String>,
pub metrics_endpoint: Option<String>,
pub metric_export_interval: Option<Duration>,
}
impl AppConfig {
fn load_from_env() -> Result<AppConfig, ServerError> {
Ok(AppConfig {
server: ServerConfig {
host: env::var("SERVER_HOST").unwrap_or(DEFAULT_SERVER_HOST.to_string()),
port: env::var("SERVER_PORT")
.unwrap_or(DEFAULT_SERVER_PORT.to_string())
.parse::<u16>()
.unwrap_or(DEFAULT_SERVER_PORT),
file_upload_max_size: env::var("SERVER_FILE_UPLOAD_MAX_SIZE")
.unwrap_or(DEFAULT_SERVER_FILE_UPLOAD_MAX_SIZE.to_string())
.parse::<usize>()
.unwrap_or(DEFAULT_SERVER_FILE_UPLOAD_MAX_SIZE),
environment: env::var("SERVER_ENVIRONMENT")
.unwrap_or(DEFAULT_SERVER_ENVIRONMENT.to_string()),
timeout: Duration::from_secs(
env::var("SERVER_REQUEST_TIMEOUT")
.unwrap_or(DEFAULT_SERVER_REQUEST_TIMEOUT.to_string())
.parse::<u64>()
.unwrap_or(DEFAULT_SERVER_REQUEST_TIMEOUT),
),
},
service: ServiceConfig {
name: env::var("SERVICE_NAME").unwrap_or(DEFAULT_SERVICE_NAME.to_string()),
},
security: SecurityConfig {
max_access_control_age: Duration::from_secs(
env::var("SECURITY_MAX_ACCESS_CONTROL_AGE")
.unwrap_or(DEFAULT_MAX_ACCESS_CONTROL_AGE.to_string())
.parse::<u64>()
.unwrap_or(DEFAULT_MAX_ACCESS_CONTROL_AGE),
),
},
otel: OtelConfig {
enabled: env::var("OTEL_ENABLED")
.unwrap_or("false".to_string())
.parse::<bool>()
.unwrap_or(false),
service_name: env::var("OTEL_SERVICE_NAME").ok(),
traces_endpoint: env::var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT").ok(),
logs_endpoint: env::var("OTEL_EXPORTER_OTLP_LOGS_ENDPOINT").ok(),
metrics_endpoint: env::var("OTEL_EXPORTER_OTLP_METRICS_ENDPOINT").ok(),
metric_export_interval: env::var("OTEL_METRIC_EXPORT_INTERVAL")
.ok()
.map(|interval| Duration::from_millis(interval.parse::<u64>().unwrap())),
},
otel_provider: OtelProviderConfig {
provider: env::var("OTEL_PROVIDER").ok(),
organization: env::var("OTEL_PROVIDER_ORGANIZATION").ok(),
stream_name: env::var("OTEL_PROVIDER_STREAM_NAME").ok(),
auth_token: env::var("OTEL_PROVIDER_AUTH_TOKEN").ok(),
},
})
}
}