hsdev-0.1.5.0: tools/Tool.hs
{-# LANGUAGE OverloadedStrings #-}
module Tool (
-- * Tool
ToolM, toolMain, printExceptT, printResult,
module Options.Applicative,
module HsDev.Util
) where
import Control.Monad.Except (ExceptT, runExceptT)
import Control.Monad.IO.Class
import Control.Monad (liftM)
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as L (putStrLn)
import Options.Applicative
import System.Environment
import System.IO
import HsDev.Tools.Base (ToolM)
import HsDev.Util (cmd, parseArgs)
-- | Run tool with commands
toolMain :: String -> String -> Parser a -> (a -> IO ()) -> IO ()
toolMain name d p act = do
hSetBuffering stdout LineBuffering
hSetEncoding stdout utf8
hSetEncoding stdin utf8
res <- liftM (parseArgs name (info p (progDesc d))) getArgs
either putStrLn act res
printExceptT :: ExceptT String IO () -> IO ()
printExceptT act = runExceptT act >>= either putStrLn return
printResult :: (ToJSON a, MonadIO m) => m a -> m ()
printResult act = act >>= liftIO . L.putStrLn . encode