public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
            [Table("executionsTable", Connection = "StorageAccount")] ICollector <ExecutionRow> outputTable,
            ILogger log)
        {
            log.LogInformation($"{FunctionNames.MortgageCalculatorFunction} start");

            // Retrieve loan, interest and numberOfPayments from HTTP Request
            #region [ Retrieve request parameters ]
            decimal loan;
            if (!GetLoanFromQueryString(req, out loan))
            {
                log.LogError($"Loan not valid");
                return(new BadRequestObjectResult("Loan not valid"));
            }

            double interest;
            if (!GetInterestFromQueryString(req, out interest))
            {
                log.LogError($"Annual Interest not valid");
                return(new BadRequestObjectResult("Annual Interest not valid"));
            }

            uint nPayments;
            if (!GetNumberOfPaymentsFromQueryString(req, out nPayments))
            {
                log.LogError($"Number of payments not valid");
                return(new BadRequestObjectResult("Number of payments not valid"));
            }
            #endregion [ Retrieve request parameters ]

            var calculatorResult =
                await mortgageCalculator.CalculateMontlyRateAsync(loan, interest, nPayments);

            #region [ Create the response ]
            var executionRow = new ExecutionRow(DateTime.Now)
            {
                AnnualInterest   = interest,
                ErrorCode        = calculatorResult.Error?.Code,
                MonthlyRate      = calculatorResult.Result,
                MortgageLoan     = loan,
                NumberOfPayments = nPayments,
                Result           = calculatorResult.Succeed
            };

            outputTable.Add(executionRow);
            #endregion [ Create the response ]

            if (calculatorResult.Succeed)
            {
                return(new OkObjectResult(calculatorResult.Result));
            }

            return(new BadRequestObjectResult(calculatorResult.Error.Message));
        }