public static void Configure(
            CommandLineApplication app,
            IServiceProvider serviceProvider,
            ILogger logger,
            CancellationToken token)
        {
            app.Description = "Output data already fetched from Kroger.com as JSON.";

            var emailOption    = app.EmailOption();
            var jsonPathOption = app.Option(
                "--jsonpath <PATH>",
                "Optional. The JSONPath to apply to the receipts.",
                CommandOptionType.SingleValue,
                o => o.Accepts().Use(new JsonPathValidator()));
            var minTransactionDateOption = app.Option(
                "--min-transaction-date <DATE>",
                "Optional. The minimum, inclusive transaction date. Use format YYYY-MM-DD.",
                CommandOptionType.SingleValue,
                o => o.Accepts().RegularExpression(@"\d{4}-\d{2}-\d{2}", "The date must match the pattern YYYY-MM-DD."));
            var maxTransactionDateOption = app.Option(
                "--max-transaction-date <DATE>",
                "Optional. The maximum, inclusive transaction date. Use format YYYY-MM-DD.",
                CommandOptionType.SingleValue,
                o => o.Accepts().RegularExpression(@"\d{4}-\d{2}-\d{2}", "The date must match the pattern YYYY-MM-DD."));
            var indentedOption = app.Option(
                "--indented",
                "Indent the JSON so that it is more human readable.",
                CommandOptionType.NoValue);
            var databasePathOption = app.DatabasePathOption();

            app.CustomHelpOption();

            app.OnExecute(async() =>
            {
                var settingsFactory = serviceProvider.GetRequiredService <KrogerScrapeSettingsFactory>();
                settingsFactory.Initialize(new KrogerScrapeSettings
                {
                    Email        = emailOption.Value().Trim(),
                    DatabasePath = databasePathOption.GetDatabasePath(),
                });

                var parameters = new JsonCommandParameters(
                    jsonPathOption.Value(),
                    minTransactionDateOption.Value(),
                    maxTransactionDateOption.Value(),
                    indentedOption.HasValue());

                await ExecuteAsync(parameters, serviceProvider, logger, token);
            });
        }
        private static async Task ExecuteAsync(
            JsonCommandParameters parameters,
            IServiceProvider serviceProvider,
            ILogger logger,
            CancellationToken token)
        {
            var entityContextFactory = serviceProvider.GetRequiredService <EntityContextFactory>();

            using (var entityContext = entityContextFactory.Create())
            {
                await entityContext.MigrateAsync(token);
            }

            var command = serviceProvider.GetRequiredService <JsonCommandLogic>();

            var json = await command.ExecuteAsync(parameters, token);

            Console.WriteLine(json);
        }