/// <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); }