Skip to main content

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    let err = match vars {
32        Ok(vars) => {
33            println!("Переменные из файла успешно загружены");
34            return Ok(vars);
35        }
36        Err(err) => {
37            println!("Ошибка загрузки переменных из файла .env: {err}");
38            err
39        }
40    };
41
42    let help = format!(
43        "\n\nПроверьте содержимое файла .env: \n{:?}",
44        TEnvVars::default()
45    );
46    println!("{}", help);
47
48    Err(err)
49}
50
51/// Загружаем переменные из окружения
52fn load_from_env<TEnvVars>() -> Result<TEnvVars, Errors>
53where
54    TEnvVars: IEnvVars,
55{
56    let vars = from_env::<TEnvVars>()?;
57    Ok(vars)
58}
59
60/// Загружаем переменные из файла .env
61fn load_from_file<TEnvVars>() -> Result<TEnvVars, Errors>
62where
63    TEnvVars: IEnvVars,
64{
65    dotenv()?;
66    let vars = from_env::<TEnvVars>()?;
67    Ok(vars)
68}