use std::fs;
mod tests;
#[derive(Clone)]
pub struct EnvLoader {
file: String,
comment: String,
value_delimiter: String,
overwrite: bool
}
impl EnvLoader {
pub fn new() -> EnvLoader {
EnvLoader {
file: String::from("./.env_plus"),
comment: String::from("//"),
value_delimiter: String::from("="),
overwrite: false,
}
}
pub fn change_file(mut self, path: String) -> Self {
self.file = path;
self
}
pub fn change_comment(mut self, comment: String) -> Self {
self.comment = comment;
self
}
pub fn change_delimiter(mut self, delimiter: String) -> Self {
self.value_delimiter = delimiter;
self
}
pub fn overwrite_envs(mut self, overwrite: bool) -> Self {
self.overwrite = overwrite;
self
}
pub fn activate(self) {
let files_loaded = load_file(self);
if !files_loaded {
eprintln!("An error has occured")
}
}
}
fn load_file(envs: EnvLoader) -> bool {
let file = fs::read_to_string(envs.file);
if file.is_err() {
println!("{:?}", file.err());
false
} else {
let unwraped_file = file.unwrap();
let file_lines = unwraped_file.lines();
for (ind, line) in file_lines.enumerate() {
load_line(line, &envs.comment, &envs.value_delimiter, &envs.overwrite, ind);
};
true
}
}
fn load_line(line: &str, comment: &String, delimiter: &String, overwrite: &bool, ind: usize) {
if line.trim().starts_with(comment) || line.trim() == "" { return };
let split_line: Vec<&str> = line.split(comment).collect();
let main_line = split_line[0];
let key_value: Vec<&str> = main_line.splitn(2, delimiter).collect();
if key_value.len() < 2 { panic!("Line {} with content '{}' does not appear to be formatted properly.", ind + 1, line) };
let key = key_value[0];
let value = key_value[1];
let env_exists = std::env::var(key);
if env_exists.is_err() {
std::env::set_var(key, value)
} else {
if !overwrite { return }
std::env::set_var(key, value)
}
}