/// <summary> /// Clones the <see cref="EvaluationContext"/> and returns a new one that contains the new variable /// </summary> private EvaluationContext GetScopeLocalContext(EvaluationContext ctx) { TemplateVariable variable; if (Value == null) { variable = new TemplateVariable( value: null, selectResolver: () => Value.ComputeSelect(ctx), pathsResolver: () => Value.ComputePaths(ctx)); } else { variable = new TemplateVariable( evalAsync: () => Value.Evaluate(ctx), selectResolver: () => Value.ComputeSelect(ctx), pathsResolver: () => Value.ComputePaths(ctx)); } var clone = ctx.Clone(); clone.SetLocalVariable(VariableName, variable); return(clone); }
/// <summary> /// Adds a local <see cref="TemplateVariable"/> to the context under the supplied name, /// overriding any existing <see cref="TemplateVariable"/> with the same name /// </summary> public void SetLocalVariable(string name, TemplateVariable variable) { if (_localVariables == null) { _localVariables = new VariablesDictionary(); } _localVariables[name] = variable; }
/// <summary> /// Retrieves the <see cref="TemplateVariable"/> from the context. Searches through the local variables first then falls back to the global /// </summary> /// <param name="variableName">The name to search for</param> /// <param name="variableEntry">The output result</param> /// <returns>True if the <see cref="TemplateVariable"/> was found, false otherwise</returns> public bool TryGetVariable(string variableName, out TemplateVariable variableEntry) => (_localVariables != null && _localVariables.TryGetValue(variableName, out variableEntry)) || _globalVariables.TryGetValue(variableName, out variableEntry);