packages feed

hsdev-0.2.1.0: tools/Tool.hs

{-# LANGUAGE OverloadedStrings #-}

module Tool (
	-- * Tool
	ToolM, toolMain, printExceptT, printResult, runToolClient,

	ClientM,

	toJSON, Value,
	module Options.Applicative,
	module Data.Monoid,
	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 Data.Default
import Data.Monoid
import Options.Applicative
import System.Environment
import System.IO

import HsDev.Client.Commands
import HsDev.Server.Base
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

runToolClient :: ToJSON a => ClientM IO a -> IO ()
runToolClient act = runServer silentOpts $
	runClient def act >>= liftIO . L.putStrLn . encode