public void Run(DataContainer commandData, ICommand command, IResponseBuilder responseBuilder)
        {
            RequestWorkPipelineValidator.Validate(commandData, command, responseBuilder);

            //command.Data.Integrate(commandData);
            responseBuilder.BuildResponse(command.Work());
        }
        public virtual async Task <Result <WebhookResponse <ContentFulfillmentWebhookData> > > HandleAsync(string authorization, TRequest request)
        {
            try
            {
                var contextResult = await GetContextFromInput(authorization, request);

                if (contextResult.ResultType != ResultType.Ok)
                {
                    return(new InvalidResult <WebhookResponse <ContentFulfillmentWebhookData> >("Failed to produce context from input"));
                }

                var context = contextResult.Data;

                if (_contentScenarios == null || _contentScenarios.Count() == 0)
                {
                    var error = "No content scenarios were registered for this feature";
                    Console.WriteLine(error);
                    return(new InvalidResult <WebhookResponse <ContentFulfillmentWebhookData> >(error));
                }

                //Find a suitable content renderer
                var canProvideContentTasks = _contentScenarios.Select(s => ReturnScenarioIfCanProvideContent(s, s.CanProvideContent(context)));
                var viableContentRenderers = (await Task.WhenAll(canProvideContentTasks))?.Where(s => s != null).ToArray();

                if (!viableContentRenderers.Any())
                {
                    var error = "No viable content scenarios found";
                    Console.WriteLine(error);
                    return(new InvalidResult <WebhookResponse <ContentFulfillmentWebhookData> >(error));
                }

                var random   = new Random();
                var scenario = viableContentRenderers[random.Next(viableContentRenderers.Length)];

                var contentResults = await scenario.GetContent(context);

                var followUpContent = await scenario.GetFollowUpContent(context);

                if (contentResults?.Any() == true)
                {
                    _responseBuilder.WithContent(contentResults[random.Next(contentResults.Length)]);
                }

                //Don't instantiate a follow up override if there's no follow up content or follow up items
                if (followUpContent?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithContent(followUpContent[random.Next(followUpContent.Length)]));
                }

                if (scenario.EventFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithEventFollowUps(scenario.EventFollowUps));
                }

                if (scenario.ExitFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithExitMessageFollowUps(scenario.ExitFollowUps));
                }

                if (scenario.FallbackFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithFallbackFollowUps(scenario.FallbackFollowUps));
                }

                if (scenario.HelpFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithHelpMessageFollowUps(scenario.HelpFollowUps));
                }

                if (scenario.LatestMessageFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithLatestMessageFollowUps(scenario.LatestMessageFollowUps));
                }

                if (scenario.NumberRangeFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithNumberRangeFollowUps(scenario.NumberRangeFollowUps));
                }

                if (scenario.QuestionAnswerFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithQuestionFollowUps(scenario.QuestionAnswerFollowUps));
                }

                if (scenario.RecipeFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithRecipeFollowUps(scenario.RecipeFollowUps));
                }

                if (scenario.SimpleChoiceFollowUps?.Any() == true)
                {
                    _responseBuilder.WithFollowUp(f => f.WithSimpleChoiceFollowUps(scenario.SimpleChoiceFollowUps));
                }

                _responseBuilder
                .WithSessionAttributes("context", JsonConvert.SerializeObject(context))
                .WithSessionAttributes("scenario", scenario.Name);

                return(new SuccessResult <WebhookResponse <ContentFulfillmentWebhookData> >(_responseBuilder.BuildResponse()));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return(new InvalidResult <WebhookResponse <ContentFulfillmentWebhookData> >("An error occurred"));
            }
            //Get the context from the feature service
        }