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