0 | module Pack.Core.Logging
2 | import Control.Monad.Either
3 | import Control.Monad.Trans
4 | import Pack.Core.Types
15 | data ConfirmResult = Yes | No | Unknown
20 | parseConfirmResult : String -> ConfirmResult
21 | parseConfirmResult x = case toLower x of
30 | confirmMessage : String -> String
31 | confirmMessage msg =
33 | then "\{msg}\n\n\{continueMessage}"
34 | else "\{msg} \{continueMessage}"
37 | isLong = length msg > 80 || isInfixOf "\n\n" msg
39 | continueMessage : String
40 | continueMessage = "Continue (yes/*no)?"
47 | -> EitherT PackErr io ()
48 | mustConfirm action = case !(lift action) of
50 | _ => throwE SafetyAbort
58 | -> {auto _ : Interpolation logLevel}
61 | -> (msgs : List String)
63 | printLogMessage lvl msg msgs = do
64 | let prefx := "[ \{lvl} ] "
65 | let baseIndent := replicate (length prefx) ' '
66 | printMultilineIndented prefx baseIndent msg
67 | for_ msgs $
printMultilineIndented "\{baseIndent}- " "\{baseIndent} "
70 | printMultilineIndented :
71 | (fstPrefix, restPrefix : String)
74 | printMultilineIndented fstPrefix restPrefix msg = do
75 | let (s::ss) = lines msg
76 | | [] => putStrLn "\{fstPrefix}"
77 | putStrLn "\{fstPrefix}\{s}"
78 | for_ ss $
\s => putStrLn "\{restPrefix}\{s}"
89 | -> (msg : Lazy String)
92 | when (lvl >= ref.level) $
printLogMessage lvl msg []
98 | prompt : HasIO io => (lvl : LogLevel) -> (msg : String) -> io String
99 | prompt lvl msg = log (MkLogRef lvl) lvl msg >> map trim getLine
107 | confirm : HasIO io => (lvl : LogLevel) -> (msg : String) -> io ConfirmResult
109 | map parseConfirmResult $
prompt lvl $
confirmMessage msg
119 | => (lvl : LogLevel)
121 | -> EitherT PackErr io ()
122 | confirmOrAbort = mustConfirm .: confirm
135 | {auto _ : HasIO io}
136 | -> {auto ref : LogRef}
137 | -> {default False inlineSingle : Bool}
138 | -> (lvl : LogLevel)
139 | -> (msg : Lazy String)
140 | -> (msgs : Lazy (List String))
142 | logMany lvl msg msgs =
143 | when (lvl >= ref.level && not (null msgs)) $
144 | case (inlineSingle, force msgs) of
145 | (True, [x] ) => printLogMessage lvl "\{msg} \{x}" []
146 | (_ , msgs) => printLogMessage lvl msg msgs
154 | {auto _ : HasIO io}
155 | -> (lvl : LogLevel)
157 | -> (msgs : List String)
159 | promptMany lvl msg msgs =
160 | let ref := MkLogRef lvl
161 | in logMany lvl msg msgs >> map trim getLine
170 | {auto _ : HasIO io}
171 | -> (lvl : LogLevel)
173 | -> (msgs : List String)
174 | -> io ConfirmResult
175 | confirmMany lvl msg msgs =
176 | map parseConfirmResult $
promptMany lvl (confirmMessage msg) msgs
184 | confirmManyOrAbort :
185 | {auto _ : HasIO io}
186 | -> (lvl : LogLevel)
188 | -> (msgs : List String)
189 | -> EitherT PackErr io ()
190 | confirmManyOrAbort lvl = mustConfirm .: confirmMany lvl
197 | debug : HasIO io => (ref : LogRef) => (msg : Lazy String) -> io ()
198 | debug = log ref Debug
205 | info : HasIO io => (ref : LogRef) => (msg : Lazy String) -> io ()
206 | info = log ref Info
213 | cache : HasIO io => (ref : LogRef) => (msg : Lazy String) -> io ()
214 | cache = log ref Cache
221 | warn : HasIO io => (ref : LogRef) => (msg : Lazy String) -> io ()
222 | warn = log ref Warning
227 | fatal : HasIO io => (err : PackErr) -> io a
229 | printLogMessage "fatal" (printErr err) []