module Web.SocketIO.Types.Event
( Event(..)
, EventName
, Payload(..)
, EventType(..)
, Package
) where
import Web.SocketIO.Types.String
import Control.Applicative
import Data.Aeson as Aeson
import qualified Data.Text.Lazy as TL
import Data.Vector (toList)
type EventName = Text
data Payload = Payload [Aeson.Value] deriving (Eq, Show)
instance Serializable Payload where
serialize (Payload payload) = serialize $ Aeson.encode payload
data Event = Event EventName Payload
| NoEvent
deriving (Show, Eq)
instance Serializable Event where
serialize (Event name (Payload [])) = serialize $ "{\"name\":\"" `TL.append` name `TL.append` "\"}"
serialize (Event name payload) = serialize $ "{\"name\":\"" `TL.append` name `TL.append` "\",\"args\":" `TL.append` serialize payload `TL.append` "}"
serialize NoEvent = ""
instance FromJSON Event where
parseJSON (Object v) = Event <$>
v .: "name" <*>
(toArgumentList <$> v .:? "args")
where toArgumentList :: Maybe Value -> Payload
toArgumentList Nothing = Payload []
toArgumentList (Just (Array a)) = Payload $ filter (/= Aeson.Null) . toList $ a
toArgumentList _ = Payload []
parseJSON _ = return NoEvent
instance ToJSON Event where
toJSON (Event name (Payload [])) = object ["name" .= name]
toJSON (Event name (Payload payload)) = object ["name" .= name, "args" .= payload]
toJSON NoEvent = object []
data EventType = Private
| Broadcast ByteString
deriving (Show, Eq)
type Package = (EventType, Event)