module Events ( Event(..) ) where import Aggregates import Control.Monad (liftM) import Data.Serialize (Serialize(..)) import Data.Text (Text) import Data.Text.Encoding (decodeUtf8, encodeUtf8) import Data.Typeable (Typeable) import Data.Word (Word8) data Event = ProjectCreated Text | ProjectRenamed Text | TaskAdded ProjectId Text deriving (Typeable, Show) instance Serialize Event where put (ProjectCreated name) = do put (0 :: Word8) put $ encodeUtf8 name put (ProjectRenamed name) = do put (1 :: Word8) put $ encodeUtf8 name put (TaskAdded pid tsd) = do put (2 :: Word8) put $ pid put $ encodeUtf8 tsd get = do i :: Word8 <- get case i of 0 -> do n <- liftM decodeUtf8 get return $ ProjectCreated n 1 -> do n <- liftM decodeUtf8 get return $ ProjectRenamed n 2 -> do pid <- get tsd <- liftM decodeUtf8 get return $ TaskAdded pid tsd _ -> do fail $ "Unrecognized event type " ++ show i