From a4e84e164987c4fd8062f88366a0b10bd38fa6b2 Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Mon, 14 Jul 2025 18:10:06 +0200 Subject: [PATCH] Add the option to log "debug" messages alongside warnings --- src/Cli.elm | 46 ++++++++++------ src/CliMonad.elm | 96 ++++++++++++++++++++++++--------- src/OpenApi/Generate.elm | 10 ++-- tests/Test/OpenApi/Generate.elm | 2 +- 4 files changed, 108 insertions(+), 46 deletions(-) diff --git a/src/Cli.elm b/src/Cli.elm index 3348d737..afe9c25a 100644 --- a/src/Cli.elm +++ b/src/Cli.elm @@ -860,7 +860,7 @@ generateFilesFromOpenApiSpecs : BackendTask.BackendTask FatalError.FatalError ( List Elm.File - , { warnings : List CliMonad.Message + , { messages : List CliMonad.Message , requiredPackages : FastSet.Set String } ) @@ -872,7 +872,7 @@ generateFilesFromOpenApiSpecs configs = |> Result.mapError (\err -> err - |> messageToString + |> errorToString |> FatalError.fromString ) |> BackendTask.fromResult @@ -960,7 +960,7 @@ generateFilesFromOpenApiSpecs configs = |> Just ) |> (::) commonFile - , { warnings = List.concatMap .warnings result + , { messages = List.concatMap .messages result , requiredPackages = List.foldl (\{ requiredPackages } acc -> FastSet.union requiredPackages acc) @@ -1033,12 +1033,12 @@ writeSdkToDisk outputDirectory files = printSuccessMessageAndWarnings : ( List String - , { warnings : List CliMonad.Message + , { messages : List CliMonad.Message , requiredPackages : FastSet.Set String } ) -> BackendTask.BackendTask FatalError.FatalError () -printSuccessMessageAndWarnings ( outputPaths, { requiredPackages, warnings } ) = +printSuccessMessageAndWarnings ( outputPaths, { requiredPackages, messages } ) = let indentBy : Int -> String -> String indentBy amount input = @@ -1070,12 +1070,12 @@ printSuccessMessageAndWarnings ( outputPaths, { requiredPackages, warnings } ) = , url = "https://package.elm-lang.org/packages/" ++ dependency ++ "/latest/" } - warningTask : BackendTask.BackendTask FatalError.FatalError () - warningTask = - warnings - |> Dict.Extra.groupBy .message + messagesTask : BackendTask.BackendTask FatalError.FatalError () + messagesTask = + messages + |> Dict.Extra.groupBy (\{ level, message } -> ( levelToString level, message )) |> Dict.toList - |> List.map logWarning + |> List.map logMessage |> BackendTask.doEach successTask : BackendTask.BackendTask error () @@ -1097,11 +1097,21 @@ printSuccessMessageAndWarnings ( outputPaths, { requiredPackages, warnings } ) = |> List.map Pages.Script.log |> BackendTask.doEach in - BackendTask.doEach [ successTask, warningTask ] + BackendTask.doEach [ successTask, messagesTask ] + + +levelToString : CliMonad.MessageLevel -> String +levelToString level = + case level of + CliMonad.Warning -> + "Waring" + CliMonad.Debug -> + "Debug" -messageToString : CliMonad.Message -> String -messageToString { path, message } = + +errorToString : CliMonad.Error -> String +errorToString { path, message } = if List.isEmpty path then "Error! " ++ message @@ -1109,12 +1119,16 @@ messageToString { path, message } = "Error! " ++ message ++ "\n Path: " ++ String.join " -> " path -logWarning : ( String, List CliMonad.Message ) -> BackendTask.BackendTask FatalError.FatalError () -logWarning ( message, messages ) = +logMessage : ( ( String, String ), List CliMonad.Message ) -> BackendTask.BackendTask FatalError.FatalError () +logMessage ( ( level, message ), messages ) = let firstLine : String firstLine = - Ansi.Color.fontColor Ansi.Color.brightYellow "Warning: " ++ message + if level == "Warning" then + Ansi.Color.fontColor Ansi.Color.brightYellow (level ++ ": ") ++ message + + else + Ansi.Color.fontColor Ansi.Color.cyan (level ++ ": ") ++ message paths : List String paths = diff --git a/src/CliMonad.elm b/src/CliMonad.elm index b7a01c0a..33648b51 100644 --- a/src/CliMonad.elm +++ b/src/CliMonad.elm @@ -1,24 +1,24 @@ module CliMonad exposing - ( CliMonad, Message, OneOfName, Path, Declaration + ( CliMonad, Message, MessageLevel(..), Error, OneOfName, Path, Declaration , run, stepOrFail , succeed, succeedWith, fail , map, map2, map3 , andThen, andThen2, andThen3, andThen4, combine, combineDict, combineMap, foldl , errorToWarning, fromApiSpec, enumName, moduleToNamespace - , withPath, withWarning, withRequiredPackage + , withPath, withWarning, withRequiredPackage, debug , todo, todoWithDefault , withFormat ) {-| -@docs CliMonad, Message, OneOfName, Path, Declaration +@docs CliMonad, Message, MessageLevel, Error, OneOfName, Path, Declaration @docs run, stepOrFail @docs succeed, succeedWith, fail @docs map, map2, map3 @docs andThen, andThen2, andThen3, andThen4, combine, combineDict, combineMap, foldl @docs errorToWarning, fromApiSpec, enumName, moduleToNamespace -@docs withPath, withWarning, withRequiredPackage +@docs withPath, withWarning, withRequiredPackage, debug @docs todo, todoWithDefault @docs withFormat @@ -39,6 +39,18 @@ import String.Extra type alias Message = + { level : MessageLevel + , message : String + , path : Path + } + + +type MessageLevel + = Warning + | Debug + + +type alias Error = { message : String , path : Path } @@ -76,12 +88,12 @@ type CliMonad a , namespace : List String , formats : FastDict.Dict InternalFormatName InternalFormat } - -> Result Message ( a, Output ) + -> Result Error ( a, Output ) ) type alias Output = - { warnings : List Message + { messages : List Message , oneOfs : FastDict.Dict OneOfName Common.OneOfData , requiredPackages : FastSet.Set String , sharedDeclarations : FastDict.Dict String { value : Elm.Expression, group : String } @@ -90,7 +102,7 @@ type alias Output = emptyOutput : Output emptyOutput = - { warnings = [] + { messages = [] , oneOfs = FastDict.empty , requiredPackages = FastSet.empty , sharedDeclarations = FastDict.empty @@ -106,25 +118,40 @@ withPath segment (CliMonad f) = Err (addPath segment message) Ok ( res, output ) -> - Ok ( res, { output | warnings = List.map (addPath segment) output.warnings } ) + Ok ( res, { output | messages = List.map (addPath segment) output.messages } ) ) -addPath : Common.UnsafeName -> Message -> Message -addPath (Common.UnsafeName segment) { path, message } = - { path = segment :: path - , message = message - } +addPath : Common.UnsafeName -> { a | path : List String } -> { a | path : List String } +addPath (Common.UnsafeName segment) message = + { message | path = segment :: message.path } withWarning : String -> CliMonad a -> CliMonad a -withWarning message (CliMonad f) = +withWarning message f = + withMessage Warning (\_ -> message) f + + +debug : String -> (a -> String) -> CliMonad a -> CliMonad a +debug label toString f = + withMessage Debug (\res -> label ++ ": " ++ toString res) f + + +withMessage : MessageLevel -> (a -> String) -> CliMonad a -> CliMonad a +withMessage level toMessage (CliMonad f) = CliMonad (\inputs -> Result.map (\( res, output ) -> ( res - , { output | warnings = { path = [], message = message } :: output.warnings } + , { output + | messages = + { level = level + , path = [] + , message = toMessage res + } + :: output.messages + } ) ) (f inputs) @@ -141,7 +168,17 @@ todoWithDefault default message = CliMonad (\{ generateTodos } -> if generateTodos then - Ok ( default, { emptyOutput | warnings = [ { path = [], message = message } ] } ) + Ok + ( default + , { emptyOutput + | messages = + [ { level = Warning + , path = [] + , message = message + } + ] + } + ) else Err @@ -186,7 +223,7 @@ map2 f (CliMonad x) (CliMonad y) = mergeOutput : Output -> Output -> Output mergeOutput l r = - { warnings = l.warnings ++ r.warnings + { messages = l.messages ++ r.messages , oneOfs = FastDict.union l.oneOfs r.oneOfs , requiredPackages = FastSet.union l.requiredPackages r.requiredPackages , sharedDeclarations = FastDict.union l.sharedDeclarations r.sharedDeclarations @@ -287,9 +324,9 @@ run : -> CliMonad (List Declaration) -> Result - Message + Error { declarations : List Declaration - , warnings : List Message + , messages : List Message , requiredPackages : FastSet.Set String } run oneOfDeclarations input (CliMonad x) = @@ -337,8 +374,8 @@ run oneOfDeclarations input (CliMonad x) = |> Result.map (\( oneOfDecls, oneOfOutput ) -> { declarations = decls ++ oneOfDecls ++ declarationsForFormats output ++ declarationsForFormats oneOfOutput - , warnings = - (oneOfOutput.warnings ++ output.warnings) + , messages = + (oneOfOutput.messages ++ output.messages) |> List.reverse , requiredPackages = FastSet.union output.requiredPackages oneOfOutput.requiredPackages } @@ -388,7 +425,17 @@ errorToWarning (CliMonad f) = Ok ( Just res, output ) Err { path, message } -> - Ok ( Nothing, { emptyOutput | warnings = [ { path = path, message = message } ] } ) + Ok + ( Nothing + , { emptyOutput + | messages = + [ { level = Warning + , path = path + , message = message + } + ] + } + ) ) @@ -498,8 +545,9 @@ withFormat basicType maybeFormatName getter default = else { emptyOutput - | warnings = - [ { message = + | messages = + [ { level = Warning + , message = "Don't know how to handle format \"" ++ formatName ++ "\" for type " diff --git a/src/OpenApi/Generate.elm b/src/OpenApi/Generate.elm index a8cc5824..62ed1b0d 100644 --- a/src/OpenApi/Generate.elm +++ b/src/OpenApi/Generate.elm @@ -102,13 +102,13 @@ files : -> OpenApi.OpenApi -> Result - CliMonad.Message + CliMonad.Error { modules : List { moduleName : List String , declarations : FastDict.Dict String { group : String, declaration : Elm.Declaration } } - , warnings : List CliMonad.Message + , messages : List CliMonad.Message , requiredPackages : FastSet.Set String } files { namespace, generateTodos, effectTypes, server, formats } apiSpec = @@ -138,7 +138,7 @@ files { namespace, generateTodos, effectTypes, server, formats } apiSpec = , formats = formats } |> Result.map - (\{ declarations, warnings, requiredPackages } -> + (\{ declarations, messages, requiredPackages } -> { modules = declarations |> Dict.Extra.groupBy (\{ moduleName } -> Common.moduleToNamespace namespace moduleName) @@ -159,7 +159,7 @@ files { namespace, generateTodos, effectTypes, server, formats } apiSpec = |> FastDict.fromList } ) - , warnings = warnings + , messages = messages , requiredPackages = requiredPackages } ) @@ -169,7 +169,7 @@ extractEnums : OpenApi.OpenApi -> Result - CliMonad.Message + CliMonad.Error (FastDict.Dict (List String) { name : Common.UnsafeName, documentation : Maybe String }) extractEnums openApi = openApi diff --git a/tests/Test/OpenApi/Generate.elm b/tests/Test/OpenApi/Generate.elm index 22656237..7bfaa8c7 100644 --- a/tests/Test/OpenApi/Generate.elm +++ b/tests/Test/OpenApi/Generate.elm @@ -108,7 +108,7 @@ suite = { moduleName : List String , declarations : FastDict.Dict String { group : String, declaration : Elm.Declaration } } - , warnings : List CliMonad.Message + , messages : List CliMonad.Message , requiredPackages : FastSet.Set String } genFiles =