Пример #1
0
        /// <summary>
        /// parse and evaluate a command line<br/>
        /// 1. parse command line<br/>
        /// error or:<br/>
        /// 2. execute command<br/>
        ///     A. internal command (modules) or alias<br/>
        ///     B. underlying shell command (found in scan paths)<br/>
        ///      file: <br/>
        ///         C. file (batch)<br/>
        ///         D. non executable file<br/>
        ///     not a file:<br/>
        ///         E. unknown command<br/>
        /// </summary>
        /// <param name="context">command evaluation context</param>
        /// <param name="expr">expression to be evaluated</param>
        /// <param name="outputX">begin x location of the command line expression in the console if applyable</param>
        /// <param name="postAnalysisPreExecOutput">text to be outputed before any analysis output</param>
        /// <returns>data returned by the analysis and the evaluation of an expression (analysis error or commmand returns or command error)</returns>
        public ExpressionEvaluationResult Eval(
            CommandEvaluationContext context,
            string expr,
            int outputX = 0,
            string postAnalysisPreExecOutput = null)        // TODO: an eval options object would be nice
        {
            try
            {
                var  pipelineParseResults = ParseCommandLine(context, SyntaxAnalyzer, expr, ExternalParserExtension);
                bool allValid             = true;
                var  evalParses           = new List <ExpressionEvaluationResult>();

                // check pipeline syntax analysis
                foreach (var pipelineParseResult in pipelineParseResults)
                {
                    allValid &= pipelineParseResult.ParseResult.ParseResultType == ParseResultType.Valid;
                    var evalParse = AnalysisPipelineParseResult(
                        context,
                        pipelineParseResult,
                        expr,
                        outputX,
                        pipelineParseResult.ParseResult
                        );

                    evalParses.Add(evalParse);
                }

                // eventually output the post analysis pre exec content
                if (!string.IsNullOrEmpty(postAnalysisPreExecOutput))
                {
                    context.Out.Echo(postAnalysisPreExecOutput);
                }

                if (!allValid)
                {
                    // 💥syntax error in pipeline - break exec
                    var err = evalParses.FirstOrDefault();
                    context.ShellEnv.UpdateVarLastCommandReturn(expr, null, err == null ? ReturnCode.OK : GetReturnCode(err), err?.SyntaxError);
                    return(err);
                }

                // run pipeline
                var evalRes = PipelineProcessor.RunPipeline(context, pipelineParseResults.FirstOrDefault());

                // update shell env
                context.ShellEnv.UpdateVarLastCommandReturn(expr, evalRes.Result, GetReturnCode(evalRes), evalRes.EvalErrorText, evalRes.EvalError);
                return(evalRes);
            }
            catch (Exception pipelineException)
            {
                // code pipeline parse or execution error
                // update shell env
                context.ShellEnv.UpdateVarLastCommandReturn(expr, ReturnCode.Error, ReturnCode.Unknown, pipelineException.Message, pipelineException);
                context.Errorln(pipelineException.Message);
                return(new ExpressionEvaluationResult(expr, null, ParseResultType.NotIdentified, null, (int)ReturnCode.Error, pipelineException, pipelineException.Message));
            }
        }
        /// <summary>
        /// 1. parse command line
        /// 2. execute command or error
        ///     A. internal command (modules)
        ///     B. underlying shell command
        ///     C. unknown command
        /// </summary>
        /// <param name="expr">expression to be evaluated</param>
        /// <returns>return code</returns>
        public ExpressionEvaluationResult Eval(
            CommandEvaluationContext context,
            string expr,
            int outputX)
        {
            var  pipelineParseResults = Parse(context, _syntaxAnalyzer, expr);
            bool allValid             = true;
            var  evalParses           = new List <ExpressionEvaluationResult>();

            foreach (var pipelineParseResult in pipelineParseResults)
            {
                allValid &= pipelineParseResult.ParseResult.ParseResultType == ParseResultType.Valid;
                var evalRes = EvalParse(context, expr, outputX, pipelineParseResult.ParseResult);
                evalParses.Add(evalRes);
            }
            if (!allValid)
            {
                return(evalParses.FirstOrDefault());
            }
            return(PipelineProcessor.RunPipeline(context, pipelineParseResults.FirstOrDefault()));
        }