0 | module IO.Async.Console
2 | import Control.Monad.Resource
3 | import Data.ByteString
6 | import IO.Async.Logging
7 | import IO.Async.Service
8 | import System.Posix.File.Prim
16 | record ConsoleOut (0 e : Type) where
17 | constructor MkConsoleOut
18 | close_ : Async e [] ()
19 | putBytes_ : ByteString -> Async e [] ()
20 | putErrBytes_ : ByteString -> Async e [] ()
23 | Resource (Async e) (ConsoleOut e) where cleanup = close_
25 | parameters {default 100 capacity : Nat}
34 | (putstr, puterr : ByteString -> Async e [] ())
35 | -> Async e es (ConsoleOut e)
36 | console putstr puterr = do
37 | srv <- stateless (const ()) putPair
38 | pure $
MkConsoleOut (cleanup srv) (send srv . (True,)) (send srv . (False,))
41 | putPair : (Bool,ByteString) -> Async e [] ()
42 | putPair (True,s) = putstr s
43 | putPair (False,s) = puterr s
51 | stdOut : Async e es (ConsoleOut e)
54 | (\bs => primIO $
Errno.ignore $
fwrite {es = [Errno]} Stdout bs)
55 | (\bs => primIO $
Errno.ignore $
fwrite {es = [Errno]} Stderr bs)
57 | parameters {auto con : ConsoleOut e}
61 | cputBytes : ByteString -> Async e es ()
62 | cputBytes s = weakenErrors $
con.putBytes_ s
66 | cputStr : String -> Async e es ()
67 | cputStr = cputBytes . fromString
72 | cputStrLn : String -> Async e es ()
73 | cputStrLn s = cputStr $
s ++ "\n"
77 | cprint : Show a => a -> Async e es ()
78 | cprint = cputStr . show
83 | cprintLn : Show a => a -> Async e es ()
84 | cprintLn = cputStrLn . show
88 | cputErrBytes : ByteString -> Async e es ()
89 | cputErrBytes s = weakenErrors $
con.putErrBytes_ s
93 | cputErr : String -> Async e es ()
94 | cputErr = cputErrBytes . fromString
99 | cputErrLn : String -> Async e es ()
100 | cputErrLn s = cputErr $
s ++ "\n"
104 | cprintErr : Show a => a -> Async e es ()
105 | cprintErr = cputErr . show
110 | cprintErrLn : Show a => a -> Async e es ()
111 | cprintErrLn = cputErrLn . show
120 | -> (LogLevel -> List String -> List String)
122 | consoleLogger c f =
123 | MkLogger $
\l,ss => case l of
124 | Error => cputErr (unlines $
f l ss)
125 | Fatal => cputErr (unlines $
f l ss)
126 | _ => cputStr (unlines $
f l ss)
129 | basicConsoleLogger : ConsoleOut e -> Logger e
130 | basicConsoleLogger c =
131 | consoleLogger c $
\l => map $
\s => "[\{l}] \{s}"
133 | col : LogLevel -> String
134 | col Trace = show $
colored White "trace"
135 | col Debug = show $
colored Cyan "debug"
136 | col Info = show $
colored Green "info"
137 | col Warn = show $
colored Yellow "warn"
138 | col Error = show $
colored Red "error"
139 | col Fatal = show $
colored Red "fatal"
141 | space : LogLevel -> String
151 | colorConsoleLogger : ConsoleOut e -> Logger e
152 | colorConsoleLogger c =
153 | consoleLogger c $
\l => map $
\s => "[\{col l}]\{space l}\{s}"
159 | severity : LogLevel -> Nat
170 | syslogLogger : ConsoleOut e -> Logger e
172 | consoleLogger c $
\l => map $
\s => "<\{show $ severity l}> \{s}"