Ejemplo n.º 1
0
        private static TextcMessageReceiverBuilder SetupCommands(IServiceProvider serviceProvider, IDictionary <string, object> settings, TextcMessageReceiverCommandSettings[] commandSettings, TextcMessageReceiverBuilder builder)
        {
            foreach (var commandSetting in commandSettings)
            {
                var syntaxes = commandSetting.Syntaxes.Select(CsdlParser.Parse).ToArray();
                if (syntaxes.Length > 0)
                {
                    var syntaxBuilder = builder.ForSyntaxes(syntaxes);

                    if (!string.IsNullOrEmpty(commandSetting.ReturnText))
                    {
                        var returnVariables = new List <string>();

                        var returnTextVariableMatches = ReturnVariablesRegex.Matches(commandSetting.ReturnText);
                        if (returnTextVariableMatches.Count > 0)
                        {
                            returnVariables.AddRange(returnTextVariableMatches.Cast <Match>().Select(m => m.Value));
                        }

                        builder = syntaxBuilder.Return((IRequestContext context) =>
                        {
                            var returnText = commandSetting.ReturnText;
                            foreach (var returnVariable in returnVariables)
                            {
                                var returnVariableValue = context
                                                          .GetVariable(returnVariable.TrimStart('{').TrimEnd('}'))?.ToString() ?? "";
                                returnText = returnText.Replace(returnVariable, returnVariableValue);
                            }

                            return(returnText.AsCompletedTask());
                        });
                    }
                    else if (commandSetting.ReturnJson != null)
                    {
                        var mediaType = MediaType.Parse(commandSetting.ReturnJsonMediaType ?? "application/json");
                        var document  = new JsonDocument(commandSetting.ReturnJson, mediaType);
                        builder = syntaxBuilder.Return(() => document.AsCompletedTask());
                    }
                    else if (!string.IsNullOrEmpty(commandSetting.ProcessorType) && !string.IsNullOrEmpty(commandSetting.Method))
                    {
                        builder = syntaxBuilder
                                  .ProcessWith(o =>
                        {
                            var processorTypeName = commandSetting.ProcessorType;
                            var methodName        = commandSetting.Method;
                            var assembly          = typeof(TextcMessageReceiverBuilder).Assembly;
                            var path = new FileInfo(assembly.Location).DirectoryName;
                            ReferencesUtil.LoadAssembliesAndReferences(path, assemblyFilter: ReferencesUtil.IgnoreSystemAndMicrosoftAssembliesFilter,
                                                                       ignoreExceptionLoadingReferencedAssembly: true);
                            var processorType = TypeResolver.Instance.Resolve(processorTypeName);
                            object processor;
                            if (!ProcessorInstancesDictionary.TryGetValue(processorType, out processor))
                            {
                                processor =
                                    Bootstrapper.CreateAsync <object>(processorType, serviceProvider, settings)
                                    .Result;
                                ProcessorInstancesDictionary.Add(processorType, processor);
                            }

                            var method = processorType.GetMethod(methodName);
                            if (method == null || method.ReturnType != typeof(Task))
                            {
                                return(new ReflectionCommandProcessor(processor, methodName, true, o, syntaxes));
                            }

                            return(new ReflectionCommandProcessor(processor, methodName, true, syntaxes: syntaxes));
                        });
                    }
                }
            }
            return(builder);
        }