1use std::{env, fs, num::NonZeroUsize, thread};
2
3use anyhow::Result;
4
5use super::{
6 AuthConfig, CodecConfig, HttpConfig, TransportConfig, UserConfig,
7 codec_flags::load_media_codec_flags,
8 codec_preferences::load_codec_preferences,
9 diagnostics::DiagnosticsConfig,
10 env::{Env, positive},
11 feature_flags::load_runtime_feature_flags,
12 settings::Config,
13 telemetry::load_telemetry_config,
14};
15
16impl Config {
17 pub fn from_env() -> Result<Self> {
25 Self::from_var_lookup(|key| env::var(key).ok())
26 }
27
28 fn from_var_lookup(get_var: impl Fn(&str) -> Option<String>) -> Result<Self> {
29 let env = Env::new(get_var, |path| fs::read_to_string(path));
30 let http = HttpConfig::from_env(&env)?;
31 let auth = AuthConfig::from_env(&env)?;
32 let user = UserConfig::from_env(&env)?;
33 let feature_flags = load_runtime_feature_flags(&env)?;
34 let codec_flags = load_media_codec_flags(&env)?;
35 let codec_preferences = load_codec_preferences(&env)?;
36 let diagnostics = DiagnosticsConfig::from_env(&env)?;
37 let telemetry = load_telemetry_config(&env)?;
38 let transport = TransportConfig::from_env(&env)?;
39 let runtime_thread_count = env.var("RUNTIME_THREAD_COUNT").check(positive).default(
40 thread::available_parallelism()
41 .map_or(1, NonZeroUsize::get)
42 .min(4),
43 )?;
44 Ok(Self {
45 auth,
46 http,
47 user,
48 transport,
49 codecs: CodecConfig {
50 flags: codec_flags,
51 preferences: codec_preferences,
52 },
53 features: feature_flags,
54 telemetry,
55 diagnostics,
56 runtime_thread_count,
57 })
58 }
59}
60
61#[cfg(test)]
62#[path = "TESTS/loader.rs"]
63mod tests;