Skip to main content

twitter_internal_api/utils/
env.rs

1use anyhow::anyhow;
2use std::fmt::{Debug, Display};
3use std::str::FromStr;
4use std::{env, fs};
5
6#[tracing::instrument(name = "get_envar", skip_all, err)]
7pub fn get_envar<T: FromStr + Debug>(name: &str) -> anyhow::Result<T>
8where
9    <T as FromStr>::Err: Display,
10{
11    let var = env::var(name).map_err(|e| {
12        tracing::error!("Didn't find envar name: {}", name);
13        anyhow!("get_envvar error: {}", e)
14    })?;
15
16    let value = var.parse::<T>().map_err(|e| {
17        tracing::error!(
18            "Couldn't parse variable '{}' with value: '{:?}' and error: '{}'",
19            name,
20            var,
21            e
22        );
23        anyhow!("get_envvar error: {}", e)
24    })?;
25    Ok(value)
26}
27
28#[tracing::instrument(name = "load_dotenv", skip_all)]
29pub fn load_dotenv() {
30    let dotenv_file = format!(
31        ".env.{}",
32        env::var("APP_ENVIRONMENT").unwrap_or("local".into())
33    );
34    if fs::exists(&dotenv_file).unwrap_or_default() {
35        tracing::info!("Loading {}", dotenv_file);
36        dotenv::from_filename(&dotenv_file).ok();
37        return;
38    }
39    if fs::exists(".env").unwrap_or_default() {
40        tracing::info!("Loading .env");
41        dotenv::from_filename(".env").ok();
42    }
43}