diff --git a/cli/src/Cli.elm b/cli/src/Cli.elm index 52c6401..f42bbc8 100644 --- a/cli/src/Cli.elm +++ b/cli/src/Cli.elm @@ -41,7 +41,7 @@ type alias CliOptions = , outputModuleName : Maybe String , effectTypes : List OpenApi.Config.EffectType , generateTodos : Bool - , autoConvertSwagger : Bool + , autoConvertSwagger : OpenApi.Config.AutoConvertSwagger , swaggerConversionUrl : Maybe String , swaggerConversionCommand : Maybe String , swaggerConversionCommandArgs : List String @@ -73,7 +73,9 @@ program = |> Cli.OptionsParser.with (Cli.Option.flag "generateTodos") |> Cli.OptionsParser.with - (Cli.Option.flag "auto-convert-swagger") + (Cli.Option.optionalKeywordArg "auto-convert-swagger" + |> Cli.Option.validateMap autoConvertValidation + ) |> Cli.OptionsParser.with (Cli.Option.optionalKeywordArg "swagger-conversion-url") |> Cli.OptionsParser.with @@ -131,10 +133,13 @@ options: a `Servers` module with your servers. You can pass in an empty object if you have fully dynamic servers. - --auto-convert-swagger If passed in, and a Swagger doc is encountered, - will attempt to convert it to an Open API file. - If not passed in, and a Swagger doc is encountered, - the user will be manually prompted to convert. + --auto-convert-swagger=ask If a Swagger doc is encountered, ask the user before converting + it to an Open API file. This is the default. + + --auto-convert-swagger=never If a Swagger doc is encountered, error out. + + --auto-convert-swagger[=always] If a Swagger doc is encountered, automatically convert it + to an Open API file. --swagger-conversion-url The URL to use to convert a Swagger doc to an Open API file. Defaults to `https://converter.swagger.io/api/convert`. @@ -157,6 +162,28 @@ options: ) +autoConvertValidation : Maybe String -> Result String OpenApi.Config.AutoConvertSwagger +autoConvertValidation input = + case input of + Nothing -> + Ok OpenApi.Config.AskBeforeConversion + + Just "ask" -> + Ok OpenApi.Config.AskBeforeConversion + + Just "" -> + Ok OpenApi.Config.AlwaysConvert + + Just "always" -> + Ok OpenApi.Config.AlwaysConvert + + Just "never" -> + Ok OpenApi.Config.NeverConvert + + Just value -> + Err ("Unexpected value for auto-convert-swagger: " ++ value) + + effectTypesValidation : Maybe String -> Result String (List OpenApi.Config.EffectType) effectTypesValidation str = case str of @@ -518,22 +545,26 @@ decodeOpenApiSpecOrFail { hasAttemptedToConvertFromSwagger } config input value Ok _ -> let - askForConversion : BackendTask error Bool - askForConversion = - if OpenApi.Config.autoConvertSwagger config then - BackendTask.succeed True - - else - Pages.Script.question - (Ansi.Color.fontColor Ansi.Color.brightCyan (OpenApi.Config.pathToString (OpenApi.Config.oasPath input)) - ++ """ is a Swagger doc (aka Open API v2) and this tool only supports Open API v3. + shouldConvertTask : BackendTask error Bool + shouldConvertTask = + case OpenApi.Config.autoConvertSwagger config of + OpenApi.Config.AlwaysConvert -> + BackendTask.succeed True + + OpenApi.Config.NeverConvert -> + BackendTask.succeed False + + OpenApi.Config.AskBeforeConversion -> + Pages.Script.question + (Ansi.Color.fontColor Ansi.Color.brightCyan (OpenApi.Config.pathToString (OpenApi.Config.oasPath input)) + ++ """ is a Swagger doc (aka Open API v2) and this tool only supports Open API v3. Would you like to use """ - ++ Ansi.Color.fontColor Ansi.Color.brightCyan (OpenApi.Config.swaggerConversionUrl config) - ++ " to upgrade to v3? (y/n)\n" - ) - |> BackendTask.map (\response -> String.toLower response == "y") + ++ Ansi.Color.fontColor Ansi.Color.brightCyan (OpenApi.Config.swaggerConversionUrl config) + ++ " to upgrade to v3? (y/n)\n" + ) + |> BackendTask.map (\response -> String.toLower response == "y") in - askForConversion + shouldConvertTask |> BackendTask.andThen (\shouldConvert -> if shouldConvert then diff --git a/cli/src/TestGenScript.elm b/cli/src/TestGenScript.elm index 8f9d5ad..99e647c 100644 --- a/cli/src/TestGenScript.elm +++ b/cli/src/TestGenScript.elm @@ -102,7 +102,7 @@ run = config : OpenApi.Config.Config config = OpenApi.Config.init "./generated" - |> OpenApi.Config.withAutoConvertSwagger True + |> OpenApi.Config.withAutoConvertSwagger OpenApi.Config.AlwaysConvert |> OpenApi.Config.withInput additionalProperties |> OpenApi.Config.withInput recursiveAllofRefs |> OpenApi.Config.withInput overridingGlobalSecurity diff --git a/review/suppressed/Docs.NoMissing.json b/review/suppressed/Docs.NoMissing.json index e99318a..e05b9b3 100644 --- a/review/suppressed/Docs.NoMissing.json +++ b/review/suppressed/Docs.NoMissing.json @@ -3,7 +3,7 @@ "automatically created by": "elm-review suppress", "learn more": "elm-review suppress --help", "suppressions": [ - { "count": 35, "filePath": "src/OpenApi/Config.elm" }, + { "count": 36, "filePath": "src/OpenApi/Config.elm" }, { "count": 5, "filePath": "src/OpenApi/Generate.elm" } ] } diff --git a/src/OpenApi/Config.elm b/src/OpenApi/Config.elm index af716f8..0e9175e 100644 --- a/src/OpenApi/Config.elm +++ b/src/OpenApi/Config.elm @@ -1,7 +1,7 @@ module OpenApi.Config exposing ( Config, EffectType(..), effectTypeToPackage, Format, Input, Path(..), Server(..) , init, inputFrom, pathFromString - , withAutoConvertSwagger, withEffectTypes, withFormat, withFormats, withGenerateTodos, withInput, withSwaggerConversionCommand, withSwaggerConversionUrl + , withAutoConvertSwagger, AutoConvertSwagger(..), withEffectTypes, withFormat, withFormats, withGenerateTodos, withInput, withSwaggerConversionCommand, withSwaggerConversionUrl , withOutputModuleName, withOverrides, withServer, withWriteMergedTo, withWarnOnMissingEnums , autoConvertSwagger, inputs, outputDirectory, swaggerConversionCommand, swaggerConversionUrl , oasPath, overrides, writeMergedTo @@ -20,7 +20,7 @@ module OpenApi.Config exposing # Creation @docs init, inputFrom, pathFromString -@docs withAutoConvertSwagger, withEffectTypes, withFormat, withFormats, withGenerateTodos, withInput, withSwaggerConversionCommand, withSwaggerConversionUrl +@docs withAutoConvertSwagger, AutoConvertSwagger, withEffectTypes, withFormat, withFormats, withGenerateTodos, withInput, withSwaggerConversionCommand, withSwaggerConversionUrl @docs withOutputModuleName, withOverrides, withServer, withWriteMergedTo, withWarnOnMissingEnums @@ -75,7 +75,7 @@ type Config { inputs : List Input , outputDirectory : String , generateTodos : Bool - , autoConvertSwagger : Bool + , autoConvertSwagger : AutoConvertSwagger , swaggerConversionUrl : String , swaggerConversionCommand : Maybe { command : String, args : List String } , staticFormats : List Format @@ -83,6 +83,13 @@ type Config } +{-| -} +type AutoConvertSwagger + = AlwaysConvert + | NeverConvert + | AskBeforeConversion + + {-| -} type Input = Input @@ -215,7 +222,7 @@ init initialOutputDirectory = { inputs = [] , outputDirectory = initialOutputDirectory , generateTodos = False - , autoConvertSwagger = False + , autoConvertSwagger = AskBeforeConversion , swaggerConversionUrl = "https://converter.swagger.io/api/convert" , swaggerConversionCommand = Nothing , staticFormats = defaultFormats @@ -445,7 +452,7 @@ withGenerateTodos generateTodos (Config config) = {-| -} -withAutoConvertSwagger : Bool -> Config -> Config +withAutoConvertSwagger : AutoConvertSwagger -> Config -> Config withAutoConvertSwagger newAutoConvertSwagger (Config config) = Config { config | autoConvertSwagger = newAutoConvertSwagger } @@ -520,7 +527,7 @@ swaggerConversionCommand (Config config) = {-| -} -autoConvertSwagger : Config -> Bool +autoConvertSwagger : Config -> AutoConvertSwagger autoConvertSwagger (Config config) = config.autoConvertSwagger