@@ -103,22 +103,22 @@ sexpToCommand (SexpList [SymbolAtom "repl-completions", StringAtom prefix]) = Ju
103103sexpToCommand (SexpList [SymbolAtom "load-file", StringAtom filename]) = Just (LoadFile filename)
104104sexpToCommand _ = Nothing
105105
106−parseMessage :: String -> (SExp, Integer)
106+parseMessage :: String -> Either Err (SExp, Integer)
107107parseMessage x = case receiveString x of
108− (SexpList [cmd, (IntegerAtom id)]) ->
109− (cmd, id)
108+ Right (SexpList [cmd, (IntegerAtom id)]) -> Right (cmd, id)
109+ Left err -> Left err
110110
111−receiveString :: String -> SExp
111+receiveString :: String -> Either Err SExp
112112receiveString x =
113113 case readHex (take 6 x) of
114114 ((num, ""):_) ->
115115 let msg = drop 6 x in
116116 if (length msg) /= (num - 1)
117− then error "bad input length"
117+ then Left . Msg $ "bad input length"
118118 else (case parseSExp msg of
119− Left _ -> error "parse failure"
120− Right r -> r)
121− _ -> error "readHex failed"
119+ Left _ -> Left . Msg $ "parse failure"
120+ Right r -> Right r)
121+ _ -> Left . Msg $ "readHex failed"
122122
123123convSExp :: SExpable a => String -> a -> Integer -> String
124124convSExp pre s id =