Exemplo n.º 1
0
        /// <summary>
        /// Evaluate a conditional code
        /// </summary>
        /// <param name="code">Code holding expressions</param>
        /// <param name="evaluateAll">Whether all or only Linux fields are supposed to be evaluated</param>
        /// <returns>Evaluation result or null</returns>
        public static async Task <string> Evaluate(Code code, bool evaluateAll)
        {
            if (code.KeywordArgument != null)
            {
                if (code.Keyword == KeywordType.Echo)
                {
                    StringBuilder builder = new();
                    foreach (string expression in SplitExpression(code.KeywordArgument))
                    {
                        try
                        {
                            string result = await EvaluateExpression(code, expression, !evaluateAll, false);

                            if (builder.Length != 0)
                            {
                                builder.Append(' ');
                            }
                            builder.Append(result);
                        }
                        catch (CodeParserException cpe)
                        {
                            throw new CodeParserException($"Failed to evaluate \"{expression}\": {cpe.Message}", cpe);
                        }
                    }
                    return(builder.ToString());
                }

                if (code.Keyword == KeywordType.Abort ||
#pragma warning disable CS0618 // Type or member is obsolete
                    code.Keyword == KeywordType.Return
#pragma warning restore CS0618 // Type or member is obsolete
                    )
                {
                    string keywordArgument = code.KeywordArgument.Trim();
                    try
                    {
                        string result = await EvaluateExpression(code, keywordArgument, !evaluateAll, false);

                        return(result);
                    }
                    catch (CodeParserException cpe)
                    {
                        throw new CodeParserException($"Failed to evaluate \"{keywordArgument}\": {cpe.Message}", cpe);
                    }
                }

                string keywordExpression;
                if (code.Keyword == KeywordType.Global || code.Keyword == KeywordType.Var || code.Keyword == KeywordType.Set)
                {
                    // Get the actual expression
                    keywordExpression = string.Empty;
                    bool inExpression = false;
                    foreach (char c in code.KeywordArgument)
                    {
                        if (inExpression)
                        {
                            keywordExpression += c;
                        }
                        else if (c == '=')
                        {
                            inExpression = true;
                        }
                    }
                }
                else
                {
                    // Condition equals the keyword argument
                    keywordExpression = code.KeywordArgument;
                }

                // Evaluate Linux properties
                try
                {
                    string result = await EvaluateExpression(code, keywordExpression.Trim(), !evaluateAll, false);

                    return(result);
                }
                catch (CodeParserException cpe)
                {
                    throw new CodeParserException($"Failed to evaluate \"{keywordExpression}\": {cpe.Message}", cpe);
                }
            }

            for (int i = 0; i < code.Parameters.Count; i++)
            {
                if (code.Parameters[i].IsExpression)
                {
                    string trimmedExpression = ((string)code.Parameters[i]).Trim();
                    try
                    {
                        string parameterValue = await EvaluateExpression(code, trimmedExpression, !evaluateAll, !evaluateAll);

                        if (!evaluateAll && !parameterValue.StartsWith('{') && !parameterValue.EndsWith('}'))
                        {
                            // Encapsulate fully expanded parameters so that plugins and RRF know it was an expression
                            parameterValue = '{' + parameterValue + '}';
                        }
                        code.Parameters[i] = new CodeParameter(code.Parameters[i].Letter, parameterValue, false, false);
                    }
                    catch (CodeParserException cpe)
                    {
                        throw new CodeParserException($"Failed to evaluate \"{trimmedExpression}\": {cpe.Message}", cpe);
                    }
                }
            }
            code.ConvertDriverIds();
            return(null);
        }
        /// <summary>
        /// Evaluate a conditional code
        /// </summary>
        /// <param name="code">Code holding expressions</param>
        /// <param name="replaceOnlyLinuxFields">Whether to evaluate only Linux attributes (not applicable for echo)</param>
        /// <returns>Evaluation result or null</returns>
        public static async Task <string> Evaluate(Code code, bool replaceOnlyLinuxFields)
        {
            if (code.KeywordArgument != null)
            {
                if (code.Keyword == KeywordType.Echo)
                {
                    StringBuilder builder = new StringBuilder();
                    foreach (string expression in SplitExpression(code.KeywordArgument))
                    {
                        try
                        {
                            string result = await EvaluateExpression(code, expression, replaceOnlyLinuxFields, false);

                            if (builder.Length != 0)
                            {
                                builder.Append(' ');
                            }
                            builder.Append(result);
                        }
                        catch (CodeParserException cpe)
                        {
                            throw new CodeParserException($"Failed to evaluate \"{expression}\": {cpe.Message}", cpe);
                        }
                    }
                    return(builder.ToString());
                }

                string keywordArgument = code.KeywordArgument.Trim();
                try
                {
                    string result = await EvaluateExpression(code, keywordArgument, replaceOnlyLinuxFields, false);

                    return(result);
                }
                catch (CodeParserException cpe)
                {
                    throw new CodeParserException($"Failed to evaluate \"{keywordArgument}\": {cpe.Message}", cpe);
                }
            }

            for (int i = 0; i < code.Parameters.Count; i++)
            {
                if (code.Parameters[i].IsExpression)
                {
                    string trimmedExpression = ((string)code.Parameters[i]).Trim();
                    try
                    {
                        string parameterValue = await EvaluateExpression(code, trimmedExpression, replaceOnlyLinuxFields, true);

                        if (!parameterValue.StartsWith('{') && !parameterValue.EndsWith('}'))
                        {
                            // Encapsulate even fully expanded parameters so that plugins and RRF know it was an expression
                            parameterValue = '{' + parameterValue + '}';
                        }
                        code.Parameters[i] = new CodeParameter(code.Parameters[i].Letter, parameterValue);
                    }
                    catch (CodeParserException cpe)
                    {
                        throw new CodeParserException($"Failed to evaluate \"{trimmedExpression}\": {cpe.Message}", cpe);
                    }
                }
            }
            code.ConvertDriverIds();
            return(null);
        }