60 lines
1.5 KiB
Idris
60 lines
1.5 KiB
Idris
|
module Output
|
||
|
|
||
|
import Quox.Pretty
|
||
|
import Options
|
||
|
|
||
|
import System.File
|
||
|
import System
|
||
|
|
||
|
public export
|
||
|
data ConsoleChannel = COut | CErr
|
||
|
|
||
|
export
|
||
|
consoleHandle : ConsoleChannel -> File
|
||
|
consoleHandle COut = stdout
|
||
|
consoleHandle CErr = stderr
|
||
|
|
||
|
public export
|
||
|
data OpenFile = OConsole ConsoleChannel | OFile String File | ONone
|
||
|
|
||
|
export
|
||
|
toOutFile : OpenFile -> OutFile
|
||
|
toOutFile (OConsole _) = Console
|
||
|
toOutFile (OFile f _) = File f
|
||
|
toOutFile ONone = NoOut
|
||
|
|
||
|
export
|
||
|
withFile : HasIO m => String -> (String -> FileError -> m a) ->
|
||
|
(OpenFile -> m a) -> m a
|
||
|
withFile f catch act = Prelude.do
|
||
|
res <- withFile f WriteTruncate pure (Prelude.map Right . act . OFile f)
|
||
|
either (catch f) pure res
|
||
|
|
||
|
export
|
||
|
withOutFile : HasIO m => ConsoleChannel -> OutFile ->
|
||
|
(String -> FileError -> m a) -> (OpenFile -> m a) -> m a
|
||
|
withOutFile _ (File f) catch act = withFile f catch act
|
||
|
withOutFile ch Console catch act = act $ OConsole ch
|
||
|
withOutFile _ NoOut catch act = act ONone
|
||
|
|
||
|
|
||
|
|
||
|
private
|
||
|
hlFor : HLType -> OutFile -> HL -> Highlight
|
||
|
hlFor Guess Console = highlightSGR
|
||
|
hlFor Guess _ = noHighlight
|
||
|
hlFor NoHL _ = noHighlight
|
||
|
hlFor Term _ = highlightSGR
|
||
|
hlFor Html _ = highlightHtml
|
||
|
|
||
|
export
|
||
|
runPretty : Options -> OutFile -> Eff Pretty a -> a
|
||
|
runPretty opts file act =
|
||
|
runPrettyWith Outer opts.flavor (hlFor opts.hlType file) 2 act
|
||
|
|
||
|
export
|
||
|
die : HasIO io => (opts : LayoutOpts) -> Doc opts -> io a
|
||
|
die opts err = do
|
||
|
ignore $ fPutStr stderr $ render opts err
|
||
|
exitFailure
|