use heck::{ToLowerCamelCase, ToSnakeCase};
use yimi_rutool::core::StrUtil;
use crate::rubase::ruenc;
use crate::rulog::rulog;
use std::env;
use std::collections::HashMap;
use crate::rubase::rutils::strutils;
pub trait IsEmptyString {
fn is_empty(&self) -> bool;
}
impl IsEmptyString for Option<String> {
fn is_empty(&self) -> bool {
return match self {
Some(s) => s.is_empty(),
_ => true,
};
}
}
impl IsEmptyString for Option<&str> {
fn is_empty(&self) -> bool {
return match self {
Some(s) => s.is_empty(),
_ => true,
};
}
}
pub fn capitalize(s: &str) -> String {
let mut c = s.chars();
match c.next(){
Some(f) => f.to_uppercase().collect::<String>() + c.as_str(),
None => String::new(),
}
}
pub fn exist_enc(var: &str) -> bool {
var.contains("enc(")
}
pub fn exist_env(var: &str) -> bool {
var.contains("$")
}
pub fn parse_env_var(var: String) -> String {
let mut ret = parse_env_var_only(var);
ret = dec_var_enc(ret);
ret
}
pub fn parse_env_var_only(var: String) -> String {
if !exist_env(var.as_str()) {
return var;
}
let words = StrUtil::split(var.as_str(), ":");
if words.len() > 1 {
for part in words {
let mut v = part;
v.push_str(":");
let w = var.replace(v.as_str(), "").replace("}", "");
return w;
}
}
rulog::info2("var:",var.to_string().as_str());
return var;
}
pub fn dec_var_enc(var: String) -> String {
if exist_enc(var.as_str()) {
let v= var.replace("enc(", "").replace(")","");
let ret = ruenc::find_bean_ruenc().unwrap().dec(&v);
return ret;
}
return var;
}
pub fn to_snake_case(p: &str) -> String {
p.to_snake_case().to_string()
}
pub fn to_camel_case(p: &str) -> String {
p.to_lower_camel_case().to_string()
}
pub fn expand_env_var(input: &str ) -> String {
if !input.contains("${"){
return input.to_string();
}
let env_map: HashMap<String, String> = env::vars().collect();
if env_map.len()>0{
return env_map.values().take(1).next().unwrap().to_string();
}
return "".to_string();
}
pub fn expand_env_vars(input: &str, env_map: &HashMap<String, String>) -> String {
let mut result = String::new();
let chars: Vec<char> = input.chars().collect();
let mut i = 0;
while i < chars.len() {
if chars[i] == '$' && i + 1 < chars.len() {
if chars[i + 1] == '{' {
let start = i + 2;
let mut end = start;
let mut depth = 1;
while end < chars.len() && depth > 0 {
if chars[end] == '{' { depth += 1; }
else if chars[end] == '}' { depth -= 1; }
end += 1;
}
let var_expr = &chars[start..end-1];
let var_str: String = var_expr.iter().collect();
let (var_name, default_value) = if let Some(idx) = var_str.find(':') {
(var_str[..idx].trim(), Some(var_str[idx+1..].trim()))
} else {
(var_str.trim(), None)
};
let value = env_map.get(var_name)
.map(|s| s.as_str())
.or_else(|| default_value)
.unwrap_or("");
result.push_str(value);
i = end;
continue;
}
else if chars[i + 1].is_alphabetic() || chars[i + 1] == '_' {
let start = i + 1;
let mut end = start;
while end < chars.len() && (chars[end].is_alphanumeric() || chars[end] == '_') {
end += 1;
}
let var_name: String = chars[start..end].iter().collect();
let value = env_map.get(&var_name).map(|s| s.as_str()).unwrap_or("");
result.push_str(value);
i = end;
continue;
}
}
result.push(chars[i]);
i += 1;
}
result
}
#[test]
fn main() {
unsafe { env::set_var("DB_DEBUG", "false".to_string() ); }
let env_map: HashMap<String, String> = env::vars().collect();
let input = "DB_DEBUG=${DB_DEBUG:true}";
let expanded = expand_env_vars(input, &env_map);
println!("{}", expanded); dotenvy::dotenv().ok();
let db_debug = env_map.get("DB_DEBUG")
.map(|s| s.as_str())
.unwrap_or("true");
println!("DB_DEBUG = {}", db_debug);
}