use std::{env::current_dir, path::PathBuf};
use dotenvy::from_path_override as env_from;
use crate::internal::var::{get_var, set_var};
#[derive(Debug, Clone)]
pub struct DotEnv {
dir: PathBuf,
env: String,
}
impl DotEnv {
pub fn new() -> Self {
Self {
dir: match current_dir() {
| Ok(dir) => dir,
| Err(_) => PathBuf::from("."),
},
env: match get_var("RUST_ENV") {
| Ok(env) => env,
| Err(_) => "development".to_string(),
},
}
}
pub fn from(dotenv: DotEnv) -> Self {
dotenv
}
pub fn directory<Dir: Into<PathBuf>>(
mut self,
dir: Dir,
) -> Self {
self.dir = dir.into();
self
}
pub fn dir<Dir: Into<PathBuf>>(
mut self,
dir: Dir,
) -> Self {
self.dir = dir.into();
self
}
pub fn environment<S: Into<String>>(
mut self,
env: S,
) -> Self {
self.env = env.into();
self
}
pub fn env<S: Into<String>>(
mut self,
env: S,
) -> Self {
self.env = env.into();
self
}
pub fn run(self) {
let files = vec![
self.dir.join(".env"),
self.dir.join(".env.local"),
self.dir.join(format!(".env.{}", self.env)),
self.dir.join(format!(".env.{}.local", self.env)),
];
for file in files {
env_from(file).ok();
}
set_var("RUST_ENV", self.env);
}
}
impl Default for DotEnv {
fn default() -> Self {
Self::new()
}
}