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