// Resolve for AutoResolve.Default templates. // These only have access to the {sys} builtin variable and don't get access to trigger binding data. internal static BindingDataResolver GetBuiltinTemplateResolver(string originalValue, INameResolver nameResolver, Validator validator) { string resolvedValue = nameResolver.ResolveWholeString(originalValue); var template = BindingTemplate.FromString(resolvedValue); if (!template.HasParameters) { // No { } tokens, bind eagerly up front. validator(originalValue); } SystemBindingData.ValidateStaticContract(template); // For static default contracts, we only have access to the built in binding data. return((newAttr, bindingData) => { var newValue = template.Bind(SystemBindingData.GetSystemBindingData(bindingData)); validator(newValue); return newValue; }); }
// Create a bindingContext. // parameters takes precedence over existingBindingData. internal static BindingContext NewBindingContext( ValueBindingContext context, IReadOnlyDictionary <string, object> existingBindingData, IDictionary <string, object> parameters) { // if bindingData was a mutable dictionary, we could just add it. // But since it's read-only, must create a new one. Dictionary <string, object> bindingData = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); var funcContext = context.FunctionContext; var methodName = funcContext.MethodName; if (existingBindingData != null) { foreach (var kv in existingBindingData) { bindingData[kv.Key] = kv.Value; } } if (parameters != null) { foreach (var kv in parameters) { bindingData[kv.Key] = kv.Value; } } // Add 'sys' binding data. var sysBindingData = new SystemBindingData { MethodName = methodName }; sysBindingData.AddToBindingData(bindingData); BindingContext bindingContext = new BindingContext(context, bindingData); return(bindingContext); }