{-# LANGUAGE OverloadedStrings #-} module Main where import qualified Codec.Compression.Zlib as Zlib import Control.Monad.State import Data.Aeson import qualified Data.Aeson.Types as T import qualified Data.Attoparsec.Char8 as Atto import qualified Data.Attoparsec.Types as Atto import qualified Data.ByteString.Char8 as BS import qualified Data.ByteString.Lazy.Char8 as LBS import Server.PersistentCommands import System.Console.Haskeline import System.IO (hFlush, stdout) import System.Environment (getArgs) import Data.Version (showVersion) import Paths_scion_browser main :: IO () main = do args<-getArgs case args of ("--version":_)->do putStrLn ("scion-browser executable, version "++ (showVersion version)) _-> do runStateT (runInputT defaultSettings loop) initialState return () loop :: InputT BrowserM () loop = do maybeLine <- getInputLine "" case maybeLine of Nothing -> return () -- ctrl+D or EOF Just line -> do case Atto.parse json (BS.pack line) of Atto.Fail _ _ e -> outputStrLn ("error in command: " ++ e) >> loop Atto.Done _ value -> case T.parse parseJSON value of Error e -> outputStrLn ("error in command: " ++ e) >> loop Success cmd -> do (res, continue) <- lift $ executeCommand cmd let encoded = encode res compressed = Zlib.compressWith Zlib.defaultCompressParams { Zlib.compressLevel = Zlib.bestSpeed } encoded liftIO $ LBS.putStr compressed liftIO $ hFlush stdout if continue then loop else return ()