protected bool MatchSelfListArg( CmdDispatcher <TEnv> dispatcher, StringReader reader, TEnv env, Args args, out string err ) { // 匹配参数 object ori = null; if (Spread) // 收集所有剩下的参数 { List <object> list = new List <object>(); int s = reader.Cursor; while (reader.Skip(Config.ListSeps) && Parser.TryParse(dispatcher, env, reader, out ori)) { list.Add(ori); s = reader.Cursor; } reader.Cursor = s; if (list.Count == 0) { err = "参数不匹配"; return(false); } ori = list.ToArray(); } else // 仅检测一个参数 { if (!Parser.TryParse(dispatcher, env, reader, out ori)) { err = "参数不匹配"; return(false); } } // 预处理得到的参数,包括参数的可行检测,以及转换 if (!ArgUtil.HandleArg(Process, env, args, ori, out object arg, out err)) { return(false); } // 如果有参数名,则将该值赋予参数 if (!string.IsNullOrEmpty(ParamName) && arg != null) { args[ParamName] = arg; } return(true); }
protected bool MatchChildren( CmdDispatcher <TEnv> dispatcher, StringReader reader, TEnv env, Args args, int childLevel, List <ICmdResult> res ) { if (certainChildren.Count == 0 && children.Count == 0 && !ArgUtil.IsListArgEnd(reader)) { res.Add(new ErrorResult( reader.Cursor, childLevel, "多余的参数:" + reader.ReadToEndOrMaxOrEmpty(Config.MaxCut, Config.EmptyStrTip))); return(false); } // 开始匹配子节点 int start = reader.Cursor; bool hasChildMatched = false; foreach (CommandNode <TEnv> child in GetRevelentNodes(reader)) { // 执行子节点的调度 hasChildMatched |= child.Dispatch(dispatcher, reader, env, args.Derives(), childLevel, res); reader.Cursor = start; } if (!hasChildMatched) { res.Add(new ErrorResult( reader.Cursor, childLevel, new StringBuilder() .AppendLine("期待:" + string.Join(",", GetTips())) .Append("得到:" + reader.ReadToEndOrMaxOrEmpty(Config.MaxCut, Config.EmptyStrTip)) .ToString())); } return(hasChildMatched); }