public static SwaggerGenOptions AddElectSwaggerGenOptions([NotNull] SwaggerGenOptions swaggerGenOptions, [NotNull] Action <ElectSwaggerOptions> configuration)
        {
            var options = configuration.GetValue();

            // Doc Info
            swaggerGenOptions.SwaggerDoc(options.Version, new Info
            {
                Title   = options.Title,
                Version = options.Version,
                Contact = !string.IsNullOrWhiteSpace(options.AuthorName) &&
                          !string.IsNullOrWhiteSpace(options.AuthorWebsite) &&
                          !string.IsNullOrWhiteSpace(options.AuthorEmail)
                    ? new Contact
                {
                    Name  = options.AuthorName,
                    Url   = options.AuthorWebsite,
                    Email = options.AuthorEmail
                }
                    : null
            });

            // XML
            IncludeXmlCommentsIfExists(swaggerGenOptions, Assembly.GetEntryAssembly());

            // Filers
            swaggerGenOptions.OperationFilter <ApiDocGroupOperationFilter>();

            swaggerGenOptions.OperationFilter <GlobalParameterOperationFilter>();

            swaggerGenOptions.OperationFilter <ParameterOperationFilter>();

            swaggerGenOptions.DocumentFilter <ShowHideInApiDocDocumentFilter>();

            swaggerGenOptions.IgnoreObsoleteProperties();

            swaggerGenOptions.IgnoreObsoleteActions();

            // Type / Properties
            if (options.IsFullSchemaForType)
            {
                swaggerGenOptions.CustomSchemaIds(type => type.FullName);
            }

            if (options.IsDescribeAllParametersInCamelCase)
            {
                swaggerGenOptions.DescribeAllParametersInCamelCase();
            }

            if (options.IsDescribeAllEnumsAsString)
            {
                swaggerGenOptions.DescribeAllEnumsAsStrings();

                if (options.IsDescribeAllParametersInCamelCase)
                {
                    swaggerGenOptions.DescribeStringEnumsInCamelCase();
                }
            }

            // Order
            swaggerGenOptions.OrderActionsBy(apiDesc => apiDesc.ActionDescriptor.DisplayName);

            return(swaggerGenOptions);
        }