@@ -2,6 +2,11 @@
3module Idris.IdeSlave(receiveMessage, sendMessage, IdeSlaveCommand(..), sexpToCommand, SExp(..)) where
3module Idris.IdeSlave(receiveMessage, sendMessage, IdeSlaveCommand(..), sexpToCommand, SExp(..)) where
5+import Idris.AbsSyntaxTree
8+import Control.Monad.Trans ( liftIO, lift )
5import Text.Printf
10import Text.Printf
6import Numeric
11import Numeric
7import Data.List
12import Data.List
@@ -92,10 +97,14 @@ sexpToCommand (List [SymbolAtom "repl-completions", StringAtom prefix]) = Just (
92sexpToCommand (List [SymbolAtom "load-file", StringAtom filename]) = Just (LoadFile filename)
97sexpToCommand (List [SymbolAtom "load-file", StringAtom filename]) = Just (LoadFile filename)
93sexpToCommand _ = Nothing
98sexpToCommand _ = Nothing
95−receiveMessage :: IO (SExp)
100+receiveMessage :: Idris (SExp)
96−receiveMessage
101+receiveMessage = do x <- liftIO $ getLine
97− = do x <- getLine
102+ case receiveString x of
103+ (List [cmd, (IntegerAtom id)]) ->
105+ putIState $ (i { ideslave_counter = id } )
98− return (receiveString x)
106+ return cmd
100receiveString :: String -> SExp
109receiveString :: String -> SExp
101receiveString x =
110receiveString x =
@@ -109,14 +118,15 @@ receiveString x =
109 Right r -> r)
118 Right r -> r)
110 _ -> error "readHex failed"
119 _ -> error "readHex failed"
112−sendMessage :: SExpable a => Integer -> Either a a -> IO ()
121+sendMessage :: SExpable a => Either a a -> Idris ()
113−sendMessage id s =
122+sendMessage s =
114− -- TODO: get real output here!!!
123+ do i <- getIState
115− case s of
124+ let msg = case s of
116− Left err -> putStrLn $ conv (List [SymbolAtom "error", toSExp err])
125+ Left err -> List [SymbolAtom "error", toSExp err]
117− Right succ -> putStrLn $ conv (List [SymbolAtom "ok", toSExp succ])
126+ Right succ -> List [SymbolAtom "ok", toSExp succ]
127+ liftIO $ putStrLn (conv (ideslave_counter i) msg)
118− where conv sexp =
128+ where conv id sexp =
119− let str = sExpToString (List [SymbolAtom "return", sexp, IntegerAtom id]) in (getHexLength str) ++ str
129+ let str = sExpToString (List [SymbolAtom "return", sexp, IntegerAtom id]) in (getHexLength str) ++ str
121getHexLength :: String -> String
131getHexLength :: String -> String
122getHexLength s = printf "%06x" (1 + (length s))
132getHexLength s = printf "%06x" (1 + (length s))