extargsparse_codegen 0.1.4

Rust Commandline User Interface
Documentation

use std::env;
use std::io::{Write};
use std::fs;

use lazy_static::lazy_static;
use chrono::{Local,Timelike,Datelike};



fn _extargs_get_environ_var(envname :&str) -> String {
	match env::var(envname) {
		Ok(v) => {
			format!("{}",v)
		},
		Err(_e) => {
			String::from("")
		}
	}
}

struct LogVar {
	level :i32,
	nostderr : bool,
	wfile : Option<fs::File>,
}



fn extargs_macro_log_init(prefix :&str) -> LogVar {
	let mut getv :String;
	let mut retv :i32 = 0;
	let mut nostderr :bool = false;
	let mut coptfile :Option<fs::File> = None;
	let mut key :String;

	key = format!("{}_LEVEL", prefix);
	getv = _extargs_get_environ_var(&key);
	if getv.len() > 0 {
		match getv.parse::<i32>() {
			Ok(v) => {
				retv = v;
			},
			Err(e) => {
				retv = 0;
				eprintln!("can not parse [{}] error[{}]", getv,e);
			}
		}
	}

	key = format!("{}_NOSTDERR",prefix);
	getv = _extargs_get_environ_var(&key);
	if getv.len() > 0 {
		nostderr = true;
	}



	key = format!("{}_LOGFILE",prefix);
	getv = _extargs_get_environ_var(&key);
	if getv.len() > 0 {
		let fo = fs::File::create(&getv);
		if fo.is_err() {
			eprintln!("can not open [{}]", getv);
		} else {
			coptfile = Some(fo.unwrap());
		}
	}

	return LogVar {
		level : retv,
		nostderr : nostderr,
		wfile : coptfile,		
	};
}

lazy_static! {
	static ref EXT_OPTIONS_LOG_LEVEL : LogVar = {
		extargs_macro_log_init("EM")
	};
}


pub (crate)  fn em_debug_out(level :i32, outs :&str) {
	if EXT_OPTIONS_LOG_LEVEL.level >= level {
		let c = format!("{}\n",outs);
		if !EXT_OPTIONS_LOG_LEVEL.nostderr {
			let _ = std::io::stderr().write_all(c.as_bytes());
		}

		if EXT_OPTIONS_LOG_LEVEL.wfile.is_some() {
			let mut wf = EXT_OPTIONS_LOG_LEVEL.wfile.as_ref().unwrap();
			let _ = wf.write(c.as_bytes());
		}
	}
	return;
}


pub (crate) fn em_log_get_timestamp() -> String {
	let now = Local::now();
	return format!("{}/{}/{} {}:{}:{}",now.year(),now.month(),now.day(),now.hour(),now.minute(),now.second());
}


macro_rules! em_log_error {
	($($arg:tt)+) => {
		let mut c :String= format!("<ERROR>{}[{}:{}]  ",em_log_get_timestamp(),file!(),line!());
		c.push_str(&(format!($($arg)+)[..]));
		em_debug_out(0,&c);
	}
}

#[allow(unused_macros)]
macro_rules! em_log_warn {
	($($arg:tt)+) => {
		let mut c :String= format!("<WARN>{}[{}:{}]  ",em_log_get_timestamp(),file!(),line!());
		c.push_str(&(format!($($arg)+)[..]));
		em_debug_out(10,&c);
	}
}


#[allow(unused_macros)]
macro_rules! em_log_info {
	($($arg:tt)+) => {
		let mut c :String= format!("<INFO>{}[{}:{}]  ",em_log_get_timestamp(),file!(),line!());
		c.push_str(&(format!($($arg)+)[..]));
		em_debug_out(20,&c);
	}
}

macro_rules! em_log_trace {
	($($arg:tt)+) => {
		let mut _c :String= format!("<TRACE>{}[{}:{}]  ",em_log_get_timestamp(),file!(),line!());
		_c.push_str(&(format!($($arg)+)[..]));
		em_debug_out(40, &_c);
	}
}