packages feed

SciFlow-0.7.0: src/Control/Workflow/Utils.hs

{-# LANGUAGE OverloadedStrings #-}

module Control.Workflow.Utils
    ( infoS
    , warnS
    , errorS
    , mkNodeId
    ) where

import qualified Data.ByteString.Char8           as B
import Network.Transport (EndPointAddress(..))
import Control.Distributed.Process (NodeId(..))
import           Data.Time                       (defaultTimeLocale, formatTime,
                                                 getZonedTime)
import           Rainbow
import           System.IO
import           Control.Monad.IO.Class                      (MonadIO, liftIO)
    
-- | Pretty print info messages.
infoS :: MonadIO m => String -> m ()
infoS txt = liftIO $ do
    t <- getTime
    let prefix = bold $ chunk ("[INFO]" ++ t ++ " ") & fore green
        msg = B.concat $ chunksToByteStrings toByteStringsColors8
            [prefix, chunk txt & fore green]
    B.hPutStrLn stderr msg
{-# INLINE infoS #-}
    
-- | Pretty print error messages.
errorS :: MonadIO m => String -> m ()
errorS txt = liftIO $ do
    t <- getTime
    let prefix = bold $ chunk ("[ERROR]" ++ t ++ " ") & fore red
        msg = B.concat $ chunksToByteStrings toByteStringsColors8
            [prefix, chunk txt & fore red]
    B.hPutStrLn stderr msg
{-# INLINE errorS #-}
    
-- | Pretty print warning messages.
warnS :: MonadIO m => String -> m ()
warnS txt = liftIO $ do
    t <- getTime
    let prefix = bold $ chunk ("[WARN]" ++ t ++ " ") & fore yellow
        msg = B.concat $ chunksToByteStrings toByteStringsColors8
            [prefix, chunk txt & fore red]
    B.hPutStrLn stderr msg
{-# INLINE warnS #-}

-- | Get current time.
getTime :: IO String
getTime = formatTime defaultTimeLocale "[%m-%d %H:%M]" <$> getZonedTime
{-# INLINE getTime #-}

-- | Construct node id given server address and port.
mkNodeId :: String    -- ^ Server address
         -> Int       -- ^ Server port
         -> NodeId
mkNodeId ip port = NodeId $ EndPointAddress $ B.intercalate ":" $
    [B.pack ip, B.pack $ show $ port, "0"]
{-# INLINE mkNodeId #-}