123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- {-# LANGUAGE OverloadedStrings #-}
- module Bricoleur.Utils
- ( cOutput
- , cDebug
- , cWarn
- , cError
- , cDie
- , bsErrorLn
- , cOpenFile
- , throw
- , F.format
- , (F.%)
- , F.stext
- , F.text
- , F.string
- , F.shown
- ) where
- import qualified Formatting as F
- import qualified Data.ByteString.Lazy.Char8 as BS
- import qualified Data.Text.Lazy as TL
- import qualified Data.Text.Lazy.Builder as TL
- import qualified Data.Text.Lazy.IO as TL
- import qualified System.Directory as Sys
- import qualified System.Exit as Sys
- import qualified System.IO as Sys
- import qualified System.Posix.IO as Posix
- import qualified System.Posix.Terminal as Posix
- import Prelude (FilePath, IO, Either(Left), ($))
- -- | Produce a 'Left' value from a format string
- throw :: F.Format (Either TL.Text r) a -> a
- throw f =
- F.runFormat f (\ b -> Left (TL.toLazyText b))
- stderr :: TL.Text -> IO ()
- stderr = TL.hPutStr Sys.stderr
- -- | Write output to stdout
- cOutput :: TL.Text -> IO ()
- cOutput = TL.putStrLn
- -- | Write a debug message to stderr.
- cDebug :: F.Format (IO ()) a -> a
- cDebug msg = F.runFormat msg $ \ b ->
- TL.hPutStrLn Sys.stderr (TL.toLazyText b)
- -- | Write a warning message to stderr. If we are connected to a TTY,
- -- then this will write in an orange color.
- cWarn :: F.Format (IO ()) a -> a
- cWarn msg = F.runFormat msg $ \b -> do
- isTTY <- Posix.queryTerminal Posix.stdOutput
- if isTTY
- then do stderr "\x1b[93m"
- stderr (TL.toLazyText b)
- stderr "\x1b[39m\n"
- else TL.hPutStrLn Sys.stderr (TL.toLazyText b)
- -- | Write an error message to stderr and exit. If we are connected to
- -- a TTY, this message will be in red.
- cError :: F.Format (IO ()) a -> a
- cError msg = F.runFormat msg $ \b -> do
- isTTY <- Posix.queryTerminal Posix.stdOutput
- if isTTY
- then do stderr "\x1b[91m"
- stderr (TL.toLazyText b)
- stderr "\x1b[39m\n"
- else TL.hPutStrLn Sys.stderr (TL.toLazyText b)
- -- | Write an error message to stderr and exit. If we are connected to
- -- a TTY, this message will be in red.
- cDie :: F.Format (IO r) a -> a
- cDie msg = F.runFormat msg $ \ b -> do
- isTTY <- Posix.queryTerminal Posix.stdOutput
- if isTTY
- then do stderr "\x1b[91m"
- stderr (TL.toLazyText b)
- stderr "\x1b[39m\n"
- else TL.hPutStrLn Sys.stderr (TL.toLazyText b)
- Sys.exitFailure
- bsErrorLn :: BS.ByteString -> IO ()
- bsErrorLn bs = do
- isTTY <- Posix.queryTerminal Posix.stdOutput
- if isTTY
- then do BS.hPutStr Sys.stderr "\x1b[91m"
- BS.hPutStr Sys.stderr bs
- BS.hPutStr Sys.stderr "\x1b[39m\n"
- else BS.hPutStrLn Sys.stderr bs
- cOpenFile :: TL.Text -> FilePath -> IO TL.Text
- cOpenFile purpose path = do
- exists <- Sys.doesFileExist path
- if exists
- then TL.readFile path
- else cDie ("Unable to open " F.% F.text F.%
- " file at " F.% F.string) purpose path
|