use qx_rs_err::err::*;
use std::any::type_name;
use std::str::FromStr;
pub fn from_str<F: FromStr>(v: &str) -> Result<F> {
let mut v = v;
let _type = type_name::<F>();
if _type == type_name::<bool>() {
if v == "1" || v == "true" || v == "T" || v == "TRUE" || v == "yes" || v == "YES" {
v = "true";
} else if v == "0" || v == "false" || v == "F" || v == "FALSE" || v == "no" || v == "NO" {
v = "false";
} else {
return Err(Error::error_info("parse bool failed").ext(v));
}
}
let val = v.parse::<F>().map_err(|_|{
Error::error_info(format!("parse {} failed", _type).as_str()).ext(v)
})?;
Ok(val)
}