Пример #1
0
        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);
        }
Пример #2
0
        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);
        }