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