use crate::string::StringExentd;
use crate::JsonV;
pub fn get_arg(input_k: impl AsRef<str>) -> JsonV {
let input_k = input_k.as_ref();
if let Some(v) = get_os_args(&input_k) {
return JsonV::String(v);
}
if let Some(mode) = get_arg_2("_watch_mode").as_str() {
let modes = mode.split_char(",");
for mode in modes {
let mode = mode.trim();
if mode == "" {
continue;
}
let r = get_arg_2(&format!("{}.{}", mode, input_k));
if !r.is_null() {
return r;
}
}
}
if let Some(mode) = get_arg_2("mode").as_str() {
let modes = mode.split_char(",");
for mode in modes {
let mode = mode.trim();
if mode == "" {
continue;
}
let r = get_arg_2(&format!("{}.{}", mode, input_k));
if !r.is_null() {
return r;
}
}
}
let r = get_arg_2(input_k);
if let JsonV::Null = r {
let default_name = match get_arg_2("_default_name") {
JsonV::String(v) => v,
_ => "default".to_owned(),
};
return get_arg_2(&format!("{}.{}", default_name, input_k));
} else {
r
}
}
fn get_arg_2(input_k: &str) -> JsonV {
if let Some(v) = get_os_args(&input_k) {
return JsonV::String(v);
}
#[cfg(feature = "use_toml")]
match get_cache_args(input_k) {
JsonV::Null => (),
v => return v,
}
match get_env_args(input_k) {
None => JsonV::Null,
Some(v) => JsonV::String(v),
}
}
fn get_os_args(input_k: &str) -> Option<String> {
let k = &format!("{}=", input_k);
let r = std::env::args_os()
.find(|v| v.to_str().unwrap_or_default().starts_with(k))
.map(|v| v.to_str().unwrap_or_default().trim_start_matches(k).to_string());
trace!("get_os_args({}) -> {:?}", input_k, &r);
r
}
#[cfg(feature = "use_toml")]
fn get_cache_args(input_k: &str) -> JsonV {
let keys = input_k.split(".").collect::<Vec<&str>>();
let rr = crate::toml_read::get_config(keys);
if !rr.is_null() {
trace!("get_cache_args({}) -> {:?}", input_k, &rr);
}
rr
}
fn get_env_args(k: &str) -> Option<String> {
use std::ffi::OsString;
let option = std::env::var_os(k);
let string = option.unwrap_or(OsString::from(""));
let s = string.to_str().unwrap_or("").to_string();
let r = if s == "" { None } else { Some(s) };
trace!("get_env_args({}) -> {:?}", k, &r);
r
}
#[test]
fn test_get_arg() {
let arg = get_arg("api.port".to_string());
println!("get_arg: {:?}", arg);
}