|  | @@ -0,0 +1,79 @@
 | 
	
		
			
				|  |  | +{-# LANGUAGE OverloadedStrings #-}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +module Collage.Utils
 | 
	
		
			
				|  |  | +( cOutput
 | 
	
		
			
				|  |  | +, cDebug
 | 
	
		
			
				|  |  | +, cWarn
 | 
	
		
			
				|  |  | +, cError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +, cOpenFile
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +, throw
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +, F.format
 | 
	
		
			
				|  |  | +, (F.%)
 | 
	
		
			
				|  |  | +, F.stext
 | 
	
		
			
				|  |  | +, F.text
 | 
	
		
			
				|  |  | +, F.string
 | 
	
		
			
				|  |  | +, F.shown
 | 
	
		
			
				|  |  | +) where
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import qualified Formatting as F
 | 
	
		
			
				|  |  | +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), ($))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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 r) 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)
 | 
	
		
			
				|  |  | +  Sys.exitFailure
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +cOpenFile :: TL.Text -> FilePath -> IO TL.Text
 | 
	
		
			
				|  |  | +cOpenFile purpose path = do
 | 
	
		
			
				|  |  | +  exists <- Sys.doesFileExist path
 | 
	
		
			
				|  |  | +  if exists
 | 
	
		
			
				|  |  | +    then TL.readFile path
 | 
	
		
			
				|  |  | +    else cError ("Unable to open " F.% F.text F.%
 | 
	
		
			
				|  |  | +                 " file at " F.% F.string) purpose path
 |