rsiot/env_vars/
load_config.rs

1use dotenvy::dotenv;
2use envy::from_env;
3
4use super::{Errors, IEnvVars};
5
6/// Загрузить настройки
7///
8/// Сначала делается попытка загрузить переменные только из окружения. Если не получилось, тогда из
9/// файла .env.
10///
11/// Для вывода сообщений используются println, поскольку загрузка переменных выполняется до
12/// инициализации tracing-subscriber
13pub fn load_config<TEnvVars>() -> Result<TEnvVars, Errors>
14where
15    TEnvVars: IEnvVars,
16{
17    println!("Пробуем загрузить переменные из окружения");
18    let vars = load_from_env();
19    match vars {
20        Ok(vars) => {
21            println!("Переменные из окружения загружены");
22            return Ok(vars);
23        }
24        Err(err) => {
25            println!("Ошибка загрузки переменных из окружения: {err}");
26        }
27    }
28
29    println!("Пробуем загрузить переменные из файла .env");
30    let vars = load_from_file();
31    match vars {
32        Ok(vars) => {
33            println!("Переменные из файла успешно загружены");
34            Ok(vars)
35        }
36        Err(err) => {
37            println!("Ошибка загрузки переменных из файла .env: {err}");
38            Err(err)
39        }
40    }
41}
42
43/// Загружаем переменные из окружения
44fn load_from_env<TEnvVars>() -> Result<TEnvVars, Errors>
45where
46    TEnvVars: IEnvVars,
47{
48    let vars = from_env::<TEnvVars>()?;
49    Ok(vars)
50}
51
52/// Загружаем переменные из файла .env
53fn load_from_file<TEnvVars>() -> Result<TEnvVars, Errors>
54where
55    TEnvVars: IEnvVars,
56{
57    dotenv()?;
58    let vars = from_env::<TEnvVars>()?;
59    Ok(vars)
60}