{-|
Module      : EventLoop.Input.InputEvent
Description : Library of all the possible 'InputEvent's in the example implementation.
Copyright   : (c) Sebastiaan la Fleur, 2014
License     : BSD3
Maintainer  : sebastiaan.la.fleur@gmail.com
Stability   : experimental
Portability : All

All different 'InputEvent's are combined to a single 'InputEvent' type. 
In this example implementation, the 'EventLoop.Input.Keyboard', 'EventLoop.Input.Mouse' and 'EventLoop.Input.SystemMessage' are modeled.
-}
module EventLoop.Input.InputEvent where

import EventLoop.Config
import EventLoop.Json
import EventLoop.Input.Keyboard
import EventLoop.Input.Mouse
import EventLoop.Input.SystemMessage

{-|
 The central 'InputEvent' type.
-}
data InputEvent = InMouse Mouse                -- ^ A 'EventLoop.Input.Mouse' event.
                | InKeyboard Keyboard          -- ^ A 'EventLoop.Input.Keyboard' event.
                | InSysMessage SystemMessageIn -- ^ A 'EventLoop.Input.SystemMessage' event.
             
{-|
 Instance to express how a JSON formatted message can be parsed into an 'InputEvent'.
-}
instance FromJSON InputEvent where
    fromJsonMessage obj@(JSONObject ms) | keyboardS == type'      = InKeyboard (fromJsonMessage obj)
                                        | mouseS == type'         = InMouse (fromJsonMessage obj)
                                        | systemmessageS == type' = InSysMessage (fromJsonMessage obj) 
                                          where
                                              JSONString type' = retrieveError typeS ms