Example #1
0
        private static async Task <Tuple <object[], IDelayedException> > PrepareParametersAsync(IReadOnlyList <string> parameterNames,
                                                                                                IReadOnlyDictionary <string, IValueProvider> parameters)
        {
            object[]         reflectionParameters = new object[parameterNames.Count];
            List <Exception> bindingExceptions    = new List <Exception>();

            for (int index = 0; index < parameterNames.Count; index++)
            {
                string         name     = parameterNames[index];
                IValueProvider provider = parameters[name];

                BindingExceptionValueProvider exceptionProvider = provider as BindingExceptionValueProvider;

                if (exceptionProvider != null)
                {
                    bindingExceptions.Add(exceptionProvider.Exception);
                }

                reflectionParameters[index] = await parameters[name].GetValueAsync();
            }

            IDelayedException delayedBindingException = null;

            if (bindingExceptions.Count == 1)
            {
                delayedBindingException = new DelayedException(bindingExceptions[0]);
            }
            else if (bindingExceptions.Count > 1)
            {
                delayedBindingException = new DelayedException(new AggregateException(bindingExceptions));
            }

            return(new Tuple <object[], IDelayedException>(reflectionParameters, delayedBindingException));
        }
Example #2
0
        public async Task <IReadOnlyDictionary <string, IValueProvider> > BindAsync(ValueBindingContext context,
                                                                                    TTriggerValue value)
        {
            Dictionary <string, IValueProvider> results = new Dictionary <string, IValueProvider>();

            IValueProvider triggerProvider;
            IReadOnlyDictionary <string, object> bindingData;

            try
            {
                ITriggerData triggerData = await _triggerBinding.BindAsync(value, context);

                triggerProvider = triggerData.ValueProvider;
                bindingData     = triggerData.BindingData;
            }
            catch (OperationCanceledException)
            {
                throw;
            }
            catch (Exception exception)
            {
                triggerProvider = new BindingExceptionValueProvider(_triggerParameterName, exception);
                bindingData     = null;
            }

            results.Add(_triggerParameterName, triggerProvider);

            BindingContext bindingContext = new BindingContext(context, bindingData);

            foreach (KeyValuePair <string, IBinding> item in _nonTriggerBindings)
            {
                string         name    = item.Key;
                IBinding       binding = item.Value;
                IValueProvider valueProvider;

                try
                {
                    valueProvider = await binding.BindAsync(bindingContext);
                }
                catch (OperationCanceledException)
                {
                    throw;
                }
                catch (Exception exception)
                {
                    valueProvider = new BindingExceptionValueProvider(name, exception);
                }

                results.Add(name, valueProvider);
            }

            return(results);
        }
        private static object[] PrepareParameters(IReadOnlyList <string> parameterNames,
                                                  IReadOnlyDictionary <string, IValueProvider> parameters, out IDelayedException delayedBindingException)
        {
            object[]         reflectionParameters = new object[parameterNames.Count];
            List <Exception> bindingExceptions    = new List <Exception>();

            for (int index = 0; index < parameterNames.Count; index++)
            {
                string         name     = parameterNames[index];
                IValueProvider provider = parameters[name];

                BindingExceptionValueProvider exceptionProvider = provider as BindingExceptionValueProvider;

                if (exceptionProvider != null)
                {
                    bindingExceptions.Add(exceptionProvider.Exception);
                }

                reflectionParameters[index] = parameters[name].GetValue();
            }

            if (bindingExceptions.Count == 0)
            {
                delayedBindingException = null;
            }
            else if (bindingExceptions.Count == 1)
            {
                delayedBindingException = new DelayedException(bindingExceptions[0]);
            }
            else
            {
                delayedBindingException = new DelayedException(new AggregateException(bindingExceptions));
            }

            return(reflectionParameters);
        }
Example #4
0
        private async Task <IReadOnlyDictionary <string, IValueProvider> > BindCoreAsync(ValueBindingContext context, object value, IDictionary <string, object> parameters)
        {
            Dictionary <string, IValueProvider> valueProviders = new Dictionary <string, IValueProvider>();
            IValueProvider triggerProvider;
            IReadOnlyDictionary <string, object> bindingData;

            try
            {
                ITriggerData triggerData = await _triggerBinding.BindAsync(value, context);

                triggerProvider = triggerData.ValueProvider;
                bindingData     = triggerData.BindingData;
            }
            catch (OperationCanceledException)
            {
                throw;
            }
            catch (Exception exception)
            {
                triggerProvider = new BindingExceptionValueProvider(_triggerParameterName, exception);
                bindingData     = null;
            }
            valueProviders.Add(_triggerParameterName, triggerProvider);
            BindingContext bindingContext = FunctionBinding.NewBindingContext(context, bindingData, parameters);

            // Bind Singleton if specified
            SingletonAttribute singletonAttribute = SingletonManager.GetFunctionSingletonOrNull(_descriptor.Method, isTriggered: true);

            if (singletonAttribute != null)
            {
                string         boundScopeId           = _singletonManager.GetBoundScopeId(singletonAttribute.ScopeId, bindingData);
                IValueProvider singletonValueProvider = new SingletonValueProvider(_descriptor.Method, boundScopeId, context.FunctionInstanceId.ToString(), singletonAttribute, _singletonManager);
                valueProviders.Add(SingletonValueProvider.SingletonParameterName, singletonValueProvider);
            }

            foreach (KeyValuePair <string, IBinding> item in _nonTriggerBindings)
            {
                string         name    = item.Key;
                IBinding       binding = item.Value;
                IValueProvider valueProvider;

                try
                {
                    if (parameters != null && parameters.ContainsKey(name))
                    {
                        valueProvider = await binding.BindAsync(parameters[name], context);
                    }
                    else
                    {
                        valueProvider = await binding.BindAsync(bindingContext);
                    }
                }
                catch (OperationCanceledException)
                {
                    throw;
                }
                catch (Exception exception)
                {
                    valueProvider = new BindingExceptionValueProvider(name, exception);
                }

                valueProviders.Add(name, valueProvider);
            }

            return(valueProviders);
        }
Example #5
0
        public async Task <IReadOnlyDictionary <string, IValueProvider> > BindAsync(ValueBindingContext context,
                                                                                    IDictionary <string, object> parameters)
        {
            Dictionary <string, IValueProvider> results = new Dictionary <string, IValueProvider>();

            if (parameters == null || !parameters.ContainsKey(_triggerParameterName))
            {
                throw new InvalidOperationException(
                          "Missing value for trigger parameter '" + _triggerParameterName + "'.");
            }

            object triggerValue = parameters[_triggerParameterName];

            IValueProvider triggerProvider;
            IReadOnlyDictionary <string, object> bindingData;

            try
            {
                ITriggerData triggerData = await _triggerBinding.BindAsync(triggerValue, context);

                triggerProvider = triggerData.ValueProvider;
                bindingData     = triggerData.BindingData;
            }
            catch (OperationCanceledException)
            {
                throw;
            }
            catch (Exception exception)
            {
                triggerProvider = new BindingExceptionValueProvider(_triggerParameterName, exception);
                bindingData     = null;
            }

            results.Add(_triggerParameterName, triggerProvider);

            BindingContext bindingContext = new BindingContext(context, bindingData);

            foreach (KeyValuePair <string, IBinding> item in _nonTriggerBindings)
            {
                string         name    = item.Key;
                IBinding       binding = item.Value;
                IValueProvider valueProvider;

                try
                {
                    if (parameters != null && parameters.ContainsKey(name))
                    {
                        valueProvider = await binding.BindAsync(parameters[name], context);
                    }
                    else
                    {
                        valueProvider = await binding.BindAsync(bindingContext);
                    }
                }
                catch (OperationCanceledException)
                {
                    throw;
                }
                catch (Exception exception)
                {
                    valueProvider = new BindingExceptionValueProvider(name, exception);
                }

                results.Add(name, valueProvider);
            }

            return(results);
        }
        private async Task <IReadOnlyDictionary <string, IValueProvider> > BindCoreAsync(ValueBindingContext context, object value, IDictionary <string, object> parameters)
        {
            Dictionary <string, IValueProvider> valueProviders = new Dictionary <string, IValueProvider>();
            IValueProvider triggerProvider;
            IReadOnlyDictionary <string, object> bindingData;

            IValueBinder triggerReturnValueProvider = null;

            try
            {
                ITriggerData triggerData = await _triggerBinding.BindAsync(value, context);

                triggerProvider            = triggerData.ValueProvider;
                bindingData                = triggerData.BindingData;
                triggerReturnValueProvider = (triggerData as TriggerData)?.ReturnValueProvider;
            }
            catch (OperationCanceledException)
            {
                throw;
            }
            catch (Exception exception)
            {
                triggerProvider = new BindingExceptionValueProvider(_triggerParameterName, exception);
                bindingData     = null;
            }

            valueProviders.Add(_triggerParameterName, triggerProvider);

            // Bind Singleton if specified
            SingletonAttribute singletonAttribute = SingletonManager.GetFunctionSingletonOrNull(_descriptor, isTriggered: true);

            if (singletonAttribute != null)
            {
                string         boundScopeId           = _singletonManager.GetBoundScopeId(singletonAttribute.ScopeId, bindingData);
                IValueProvider singletonValueProvider = new SingletonValueProvider(_descriptor, boundScopeId, context.FunctionInstanceId.ToString(), singletonAttribute, _singletonManager);
                valueProviders.Add(SingletonValueProvider.SingletonParameterName, singletonValueProvider);
            }

            BindingContext bindingContext = FunctionBinding.NewBindingContext(context, bindingData, parameters);

            foreach (KeyValuePair <string, IBinding> item in _nonTriggerBindings)
            {
                string         name    = item.Key;
                IBinding       binding = item.Value;
                IValueProvider valueProvider;

                try
                {
                    if (parameters != null && parameters.ContainsKey(name))
                    {
                        valueProvider = await binding.BindAsync(parameters[name], context);
                    }
                    else
                    {
                        valueProvider = await binding.BindAsync(bindingContext);
                    }
                }
                catch (OperationCanceledException)
                {
                    throw;
                }
                catch (Exception exception)
                {
                    valueProvider = new BindingExceptionValueProvider(name, exception);
                }

                valueProviders.Add(name, valueProvider);
            }

            // Triggers can optionally process the return values of functions. They do so by declaring
            // a "$return" key in their binding data dictionary and mapping it to an IValueBinder.
            // An explicit return binding takes precedence over an implicit trigger binding.
            if (!valueProviders.ContainsKey(FunctionIndexer.ReturnParamName))
            {
                if (triggerReturnValueProvider != null)
                {
                    valueProviders.Add(FunctionIndexer.ReturnParamName, triggerReturnValueProvider);
                }
            }

            return(valueProviders);
        }