From 2966db997f43c063389285ddc40579acad5c6a29 Mon Sep 17 00:00:00 2001 From: James Crayne Date: Mon, 22 Jun 2015 18:58:47 -0400 Subject: kikid: Serialization... --- KikiD/Message.hs | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) (limited to 'KikiD/Message.hs') diff --git a/KikiD/Message.hs b/KikiD/Message.hs index 5b642f3..cd3ee71 100644 --- a/KikiD/Message.hs +++ b/KikiD/Message.hs @@ -1,22 +1,37 @@ +{-# LANGUAGE DoAndIfThenElse #-} module KikiD.Message where -import Data.Serialize -import qualified KikiD.GetLine +import Data.Serialize as Cereal import qualified Data.ByteString.Char8 as B import Data.Monoid import Text.Read -import Data.Char (ord) +import Data.Char (ord,chr) import Control.Monad +import Data.Bytes.Serial as R +import Data.Bytes.Put as Put +import Data.Bytes.Get as Get +import Codec.LineReady +import Control.Monad.Loops data KikiDMessage = TODO deriving (Show,Read) instance Serialize KikiDMessage where - put m = mapM_ (putWord8 . fromIntegral . ord) "TODO" + put m = mapM_ (Cereal.putWord8 . fromIntegral . ord) "TO\nO" -- putByteString . B.pack $ show m ++ "\n" get = do - t <- getWord8 - o <- getWord8 - d <- getWord8 - o <- getWord8 - return TODO - + t <- Cereal.getWord8 + o <- Cereal.getWord8 + d <- Cereal.getWord8 + o <- Cereal.getWord8 + let s = map (chr . fromIntegral) [t,o,d,o] + if "TO\nO" == s + then return TODO + else fail ("Could not decode message: " ++ show s) + +instance Serial KikiDMessage where + serialize m = Put.putByteString . toLineReady . Cereal.encode $ m + deserialize = do + xs <- unfoldWhileM (/= '\n') (fmap (chr . fromIntegral) Get.getWord8) + case (Cereal.decode . fromLineReady $ B.pack xs) of + Left str -> fail str + Right x -> return x -- cgit v1.2.3