module Main where
import Control.Monad.State
import Data.Aeson
import qualified Data.Aeson.Types as T
import qualified Data.Attoparsec.Char8 as Atto
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as LBS
import Server.Commands
import System.Console.Haskeline
main :: IO ()
main = 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
liftIO $ LBS.putStrLn $ encode res
if continue then loop else return ()