7 个版本
0.2.2 | 2024年7月10日 |
---|---|
0.2.0 | 2023年5月19日 |
0.1.8 | 2022年12月15日 |
0.1.4 | 2022年8月17日 |
0.1.0 | 2022年5月30日 |
#25 在 #worker
每月126 次下载
385KB
10K SLoC
extargsparse_worker
rust 命令包用于 json 字符串集
发布历史
- 2024年7月10日 发布 0.2.2 版本,修复了当布尔值默认为 true 时的帮助信息中的错误
- 2023年5月19日 发布 0.2.0 版本,添加了文档和示例
- 2022年12月15日 发布 0.1.8 版本,修复了 parse_commandline_ex 中的 usize 错误
lib.rs
:
这是命令行解析器示例的 worker 包
use extargsparse_codegen::{ArgSet,extargs_load_commandline,extargs_map_function};
use extargsparse_worker::argset::{ArgSetImpl};
use extargsparse_worker::{extargs_error_class,extargs_new_error};
use extargsparse_worker::key::{ExtKeyParse};
use extargsparse_worker::namespace::NameSpaceEx;
use extargsparse_worker::funccall::ExtArgsParseFunc;
use extargsparse_worker::parser::ExtArgsParser;
use std::error::Error;
use lazy_static::lazy_static;
use regex::Regex;
use std::sync::Arc;
use std::cell::RefCell;
use std::any::Any;
use std::collections::HashMap;
use std::borrow::Borrow;
use std::borrow::BorrowMut;
extargs_error_class!{OptHdlError}
#[derive(ArgSet)]
struct DepSt {
subnargs :Vec<String>,
strv : String,
list :Vec<String>,
}
#[derive(ArgSet)]
struct RdepSt {
strv :String,
subnargs : Vec<String>,
list :Vec<String>,
}
/*******************************
* ArgSet derived only accept
* i32 i64 f32 f64 Vec<String> String bool
* and derived ArgSet struct.
*******************************/
#[derive(ArgSet)]
struct SubCmdStruct {
verbose :i32,
pair :Vec<String>,
dep :DepSt,
rdep :RdepSt,
args :Vec<String>,
}
fn pair_key_handle(ns :NameSpaceEx, validx :i32, keycls :ExtKeyParse, params :Vec<String>) -> Result<i32,Box<dyn Error>> {
println!("validx [{}]",validx);
if params.len() < (validx + 2) as usize {
extargs_new_error!{OptHdlError,"need 2 args"}
}
let mut vc :Vec<String> = ns.get_array(&(keycls.opt_dest()));
vc.push(format!("{}",params[validx as usize]));
vc.push(format!("{}",params[(validx + 1) as usize]));
let _ = ns.set_array(&(keycls.opt_dest()),vc)?;
return Ok(2);
}
/*this is the example call the mut pointer change the value*/
fn dep_handler(_ns :NameSpaceEx, _args :Option<Arc<RefCell<dyn ArgSetImpl>>>, _ctx : Option<Arc<RefCell<dyn Any>>>) -> Result<(),Box<dyn Error>> {
println!("in dep_handler");
if _args.is_some() {
println!("some _args");
let ctx = _args.as_ref().unwrap().clone();
let c = ctx.as_ptr() as *const RefCell<dyn ArgSetImpl>;
let b = c.borrow();
let cc = *b as *const SubCmdStruct;
let bbcref :&SubCmdStruct = unsafe {cc.as_ref().unwrap()};
println!("verbose {}", bbcref.verbose);
println!("pair {:?}", bbcref.pair);
println!("args {:?}", bbcref.args);
println!("subnargs {:?}", bbcref.dep.subnargs);
println!("strv {}", bbcref.dep.strv);
println!("list {:?}",bbcref.dep.list);
} else {
println!("none of _args");
}
Ok(())
}
/* this is the example call the const pointer */
fn rdep_handler(_ns :NameSpaceEx, _args :Option<Arc<RefCell<dyn ArgSetImpl>>>, _ctx : Option<Arc<RefCell<dyn Any>>>) -> Result<(),Box<dyn Error>> {
println!("in rdep_handler");
if _args.is_some() {
println!("some _args");
let ctx = _args.as_ref().unwrap().clone();
let mut c = ctx.as_ptr() as *mut RefCell<dyn ArgSetImpl>;
let b = c.borrow_mut();
let cc = *b as *mut SubCmdStruct;
let bbcref :&mut SubCmdStruct = unsafe {cc.as_mut().unwrap()};
println!("verbose {}", bbcref.verbose);
println!("pair {:?}", bbcref.pair);
println!("args {:?}", bbcref.args);
println!("subnargs {:?}", bbcref.rdep.subnargs);
println!("strv {}", bbcref.rdep.strv);
bbcref.rdep.list.push(format!("rdep"));
println!("list {:?}",bbcref.rdep.list);
} else {
println!("none of _args");
}
Ok(())
}
#[extargs_map_function(optparse=pair_key_handle,dep_handler,rdep_handler)]
fn main() -> Result<(),Box<dyn Error>> {
let loads = r#"{
"verbose" : "+",
"pair|p!optparse=pair_key_handle!##to set pair parameters##" : [],
"dep<dep_handler>" : {
"$" : "*",
"list|L" : [],
"str|S<strv>" : ""
},
"rdep<rdep_handler>" : {
"$" : "*",
"list|l" : [],
"str|s<strv>" : ""
}
}"#;
let parser :ExtArgsParser = ExtArgsParser::new(None,None)?;
extargs_load_commandline!(parser,loads)?;
let v :SubCmdStruct = SubCmdStruct::new();
let argv :Arc<RefCell<SubCmdStruct>> = Arc::new(RefCell::new(v));
let _ = parser.parse_commandline_ex(None,None,Some(argv.clone()),None)?;
Ok(())
}
依赖关系
~5–7MB
~133K SLoC