{-# LANGUAGE OverloadedStrings, RecordWildCards, TupleSections #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeFamilies #-}


{- |
= Input

-}


module CDP.Domains.Input (module CDP.Domains.Input) where

import           Control.Applicative  ((<$>))
import           Control.Monad
import           Control.Monad.Loops
import           Control.Monad.Trans  (liftIO)
import qualified Data.Map             as M
import           Data.Maybe          
import Data.Functor.Identity
import Data.String
import qualified Data.Text as T
import qualified Data.List as List
import qualified Data.Text.IO         as TI
import qualified Data.Vector          as V
import Data.Aeson.Types (Parser(..))
import           Data.Aeson           (FromJSON (..), ToJSON (..), (.:), (.:?), (.=), (.!=), (.:!))
import qualified Data.Aeson           as A
import qualified Network.HTTP.Simple as Http
import qualified Network.URI          as Uri
import qualified Network.WebSockets as WS
import Control.Concurrent
import qualified Data.ByteString.Lazy as BS
import qualified Data.Map as Map
import Data.Proxy
import System.Random
import GHC.Generics
import Data.Char
import Data.Default

import CDP.Internal.Utils




-- | Type 'Input.TouchPoint'.
data InputTouchPoint = InputTouchPoint
  {
    -- | X coordinate of the event relative to the main frame's viewport in CSS pixels.
    inputTouchPointX :: Double,
    -- | Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
    --   the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
    inputTouchPointY :: Double,
    -- | X radius of the touch area (default: 1.0).
    inputTouchPointRadiusX :: Maybe Double,
    -- | Y radius of the touch area (default: 1.0).
    inputTouchPointRadiusY :: Maybe Double,
    -- | Rotation angle (default: 0.0).
    inputTouchPointRotationAngle :: Maybe Double,
    -- | Force (default: 1.0).
    inputTouchPointForce :: Maybe Double,
    -- | The normalized tangential pressure, which has a range of [-1,1] (default: 0).
    inputTouchPointTangentialPressure :: Maybe Double,
    -- | The plane angle between the Y-Z plane and the plane containing both the stylus axis and the Y axis, in degrees of the range [-90,90], a positive tiltX is to the right (default: 0)
    inputTouchPointTiltX :: Maybe Int,
    -- | The plane angle between the X-Z plane and the plane containing both the stylus axis and the X axis, in degrees of the range [-90,90], a positive tiltY is towards the user (default: 0).
    inputTouchPointTiltY :: Maybe Int,
    -- | The clockwise rotation of a pen stylus around its own major axis, in degrees in the range [0,359] (default: 0).
    inputTouchPointTwist :: Maybe Int,
    -- | Identifier used to track touch sources between events, must be unique within an event.
    inputTouchPointId :: Maybe Double
  }
  deriving (Eq, Show)
instance FromJSON InputTouchPoint where
  parseJSON = A.withObject "InputTouchPoint" $ \o -> InputTouchPoint
    <$> o A..: "x"
    <*> o A..: "y"
    <*> o A..:? "radiusX"
    <*> o A..:? "radiusY"
    <*> o A..:? "rotationAngle"
    <*> o A..:? "force"
    <*> o A..:? "tangentialPressure"
    <*> o A..:? "tiltX"
    <*> o A..:? "tiltY"
    <*> o A..:? "twist"
    <*> o A..:? "id"
instance ToJSON InputTouchPoint where
  toJSON p = A.object $ catMaybes [
    ("x" A..=) <$> Just (inputTouchPointX p),
    ("y" A..=) <$> Just (inputTouchPointY p),
    ("radiusX" A..=) <$> (inputTouchPointRadiusX p),
    ("radiusY" A..=) <$> (inputTouchPointRadiusY p),
    ("rotationAngle" A..=) <$> (inputTouchPointRotationAngle p),
    ("force" A..=) <$> (inputTouchPointForce p),
    ("tangentialPressure" A..=) <$> (inputTouchPointTangentialPressure p),
    ("tiltX" A..=) <$> (inputTouchPointTiltX p),
    ("tiltY" A..=) <$> (inputTouchPointTiltY p),
    ("twist" A..=) <$> (inputTouchPointTwist p),
    ("id" A..=) <$> (inputTouchPointId p)
    ]

-- | Type 'Input.GestureSourceType'.
data InputGestureSourceType = InputGestureSourceTypeDefault | InputGestureSourceTypeTouch | InputGestureSourceTypeMouse
  deriving (Ord, Eq, Show, Read)
instance FromJSON InputGestureSourceType where
  parseJSON = A.withText "InputGestureSourceType" $ \v -> case v of
    "default" -> pure InputGestureSourceTypeDefault
    "touch" -> pure InputGestureSourceTypeTouch
    "mouse" -> pure InputGestureSourceTypeMouse
    "_" -> fail "failed to parse InputGestureSourceType"
instance ToJSON InputGestureSourceType where
  toJSON v = A.String $ case v of
    InputGestureSourceTypeDefault -> "default"
    InputGestureSourceTypeTouch -> "touch"
    InputGestureSourceTypeMouse -> "mouse"

-- | Type 'Input.MouseButton'.
data InputMouseButton = InputMouseButtonNone | InputMouseButtonLeft | InputMouseButtonMiddle | InputMouseButtonRight | InputMouseButtonBack | InputMouseButtonForward
  deriving (Ord, Eq, Show, Read)
instance FromJSON InputMouseButton where
  parseJSON = A.withText "InputMouseButton" $ \v -> case v of
    "none" -> pure InputMouseButtonNone
    "left" -> pure InputMouseButtonLeft
    "middle" -> pure InputMouseButtonMiddle
    "right" -> pure InputMouseButtonRight
    "back" -> pure InputMouseButtonBack
    "forward" -> pure InputMouseButtonForward
    "_" -> fail "failed to parse InputMouseButton"
instance ToJSON InputMouseButton where
  toJSON v = A.String $ case v of
    InputMouseButtonNone -> "none"
    InputMouseButtonLeft -> "left"
    InputMouseButtonMiddle -> "middle"
    InputMouseButtonRight -> "right"
    InputMouseButtonBack -> "back"
    InputMouseButtonForward -> "forward"

-- | Type 'Input.TimeSinceEpoch'.
--   UTC time in seconds, counted from January 1, 1970.
type InputTimeSinceEpoch = Double

-- | Type 'Input.DragDataItem'.
data InputDragDataItem = InputDragDataItem
  {
    -- | Mime type of the dragged data.
    inputDragDataItemMimeType :: T.Text,
    -- | Depending of the value of `mimeType`, it contains the dragged link,
    --   text, HTML markup or any other data.
    inputDragDataItemData :: T.Text,
    -- | Title associated with a link. Only valid when `mimeType` == "text/uri-list".
    inputDragDataItemTitle :: Maybe T.Text,
    -- | Stores the base URL for the contained markup. Only valid when `mimeType`
    --   == "text/html".
    inputDragDataItemBaseURL :: Maybe T.Text
  }
  deriving (Eq, Show)
instance FromJSON InputDragDataItem where
  parseJSON = A.withObject "InputDragDataItem" $ \o -> InputDragDataItem
    <$> o A..: "mimeType"
    <*> o A..: "data"
    <*> o A..:? "title"
    <*> o A..:? "baseURL"
instance ToJSON InputDragDataItem where
  toJSON p = A.object $ catMaybes [
    ("mimeType" A..=) <$> Just (inputDragDataItemMimeType p),
    ("data" A..=) <$> Just (inputDragDataItemData p),
    ("title" A..=) <$> (inputDragDataItemTitle p),
    ("baseURL" A..=) <$> (inputDragDataItemBaseURL p)
    ]

-- | Type 'Input.DragData'.
data InputDragData = InputDragData
  {
    inputDragDataItems :: [InputDragDataItem],
    -- | List of filenames that should be included when dropping
    inputDragDataFiles :: Maybe [T.Text],
    -- | Bit field representing allowed drag operations. Copy = 1, Link = 2, Move = 16
    inputDragDataDragOperationsMask :: Int
  }
  deriving (Eq, Show)
instance FromJSON InputDragData where
  parseJSON = A.withObject "InputDragData" $ \o -> InputDragData
    <$> o A..: "items"
    <*> o A..:? "files"
    <*> o A..: "dragOperationsMask"
instance ToJSON InputDragData where
  toJSON p = A.object $ catMaybes [
    ("items" A..=) <$> Just (inputDragDataItems p),
    ("files" A..=) <$> (inputDragDataFiles p),
    ("dragOperationsMask" A..=) <$> Just (inputDragDataDragOperationsMask p)
    ]

-- | Type of the 'Input.dragIntercepted' event.
data InputDragIntercepted = InputDragIntercepted
  {
    inputDragInterceptedData :: InputDragData
  }
  deriving (Eq, Show)
instance FromJSON InputDragIntercepted where
  parseJSON = A.withObject "InputDragIntercepted" $ \o -> InputDragIntercepted
    <$> o A..: "data"
instance Event InputDragIntercepted where
  eventName _ = "Input.dragIntercepted"

-- | Dispatches a drag event into the page.

-- | Parameters of the 'Input.dispatchDragEvent' command.
data PInputDispatchDragEventType = PInputDispatchDragEventTypeDragEnter | PInputDispatchDragEventTypeDragOver | PInputDispatchDragEventTypeDrop | PInputDispatchDragEventTypeDragCancel
  deriving (Ord, Eq, Show, Read)
instance FromJSON PInputDispatchDragEventType where
  parseJSON = A.withText "PInputDispatchDragEventType" $ \v -> case v of
    "dragEnter" -> pure PInputDispatchDragEventTypeDragEnter
    "dragOver" -> pure PInputDispatchDragEventTypeDragOver
    "drop" -> pure PInputDispatchDragEventTypeDrop
    "dragCancel" -> pure PInputDispatchDragEventTypeDragCancel
    "_" -> fail "failed to parse PInputDispatchDragEventType"
instance ToJSON PInputDispatchDragEventType where
  toJSON v = A.String $ case v of
    PInputDispatchDragEventTypeDragEnter -> "dragEnter"
    PInputDispatchDragEventTypeDragOver -> "dragOver"
    PInputDispatchDragEventTypeDrop -> "drop"
    PInputDispatchDragEventTypeDragCancel -> "dragCancel"
data PInputDispatchDragEvent = PInputDispatchDragEvent
  {
    -- | Type of the drag event.
    pInputDispatchDragEventType :: PInputDispatchDragEventType,
    -- | X coordinate of the event relative to the main frame's viewport in CSS pixels.
    pInputDispatchDragEventX :: Double,
    -- | Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
    --   the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
    pInputDispatchDragEventY :: Double,
    pInputDispatchDragEventData :: InputDragData,
    -- | Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
    --   (default: 0).
    pInputDispatchDragEventModifiers :: Maybe Int
  }
  deriving (Eq, Show)
pInputDispatchDragEvent
  {-
  -- | Type of the drag event.
  -}
  :: PInputDispatchDragEventType
  {-
  -- | X coordinate of the event relative to the main frame's viewport in CSS pixels.
  -}
  -> Double
  {-
  -- | Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
  --   the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
  -}
  -> Double
  -> InputDragData
  -> PInputDispatchDragEvent
pInputDispatchDragEvent
  arg_pInputDispatchDragEventType
  arg_pInputDispatchDragEventX
  arg_pInputDispatchDragEventY
  arg_pInputDispatchDragEventData
  = PInputDispatchDragEvent
    arg_pInputDispatchDragEventType
    arg_pInputDispatchDragEventX
    arg_pInputDispatchDragEventY
    arg_pInputDispatchDragEventData
    Nothing
instance ToJSON PInputDispatchDragEvent where
  toJSON p = A.object $ catMaybes [
    ("type" A..=) <$> Just (pInputDispatchDragEventType p),
    ("x" A..=) <$> Just (pInputDispatchDragEventX p),
    ("y" A..=) <$> Just (pInputDispatchDragEventY p),
    ("data" A..=) <$> Just (pInputDispatchDragEventData p),
    ("modifiers" A..=) <$> (pInputDispatchDragEventModifiers p)
    ]
instance Command PInputDispatchDragEvent where
  type CommandResponse PInputDispatchDragEvent = ()
  commandName _ = "Input.dispatchDragEvent"
  fromJSON = const . A.Success . const ()

-- | Dispatches a key event to the page.

-- | Parameters of the 'Input.dispatchKeyEvent' command.
data PInputDispatchKeyEventType = PInputDispatchKeyEventTypeKeyDown | PInputDispatchKeyEventTypeKeyUp | PInputDispatchKeyEventTypeRawKeyDown | PInputDispatchKeyEventTypeChar
  deriving (Ord, Eq, Show, Read)
instance FromJSON PInputDispatchKeyEventType where
  parseJSON = A.withText "PInputDispatchKeyEventType" $ \v -> case v of
    "keyDown" -> pure PInputDispatchKeyEventTypeKeyDown
    "keyUp" -> pure PInputDispatchKeyEventTypeKeyUp
    "rawKeyDown" -> pure PInputDispatchKeyEventTypeRawKeyDown
    "char" -> pure PInputDispatchKeyEventTypeChar
    "_" -> fail "failed to parse PInputDispatchKeyEventType"
instance ToJSON PInputDispatchKeyEventType where
  toJSON v = A.String $ case v of
    PInputDispatchKeyEventTypeKeyDown -> "keyDown"
    PInputDispatchKeyEventTypeKeyUp -> "keyUp"
    PInputDispatchKeyEventTypeRawKeyDown -> "rawKeyDown"
    PInputDispatchKeyEventTypeChar -> "char"
data PInputDispatchKeyEvent = PInputDispatchKeyEvent
  {
    -- | Type of the key event.
    pInputDispatchKeyEventType :: PInputDispatchKeyEventType,
    -- | Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
    --   (default: 0).
    pInputDispatchKeyEventModifiers :: Maybe Int,
    -- | Time at which the event occurred.
    pInputDispatchKeyEventTimestamp :: Maybe InputTimeSinceEpoch,
    -- | Text as generated by processing a virtual key code with a keyboard layout. Not needed for
    --   for `keyUp` and `rawKeyDown` events (default: "")
    pInputDispatchKeyEventText :: Maybe T.Text,
    -- | Text that would have been generated by the keyboard if no modifiers were pressed (except for
    --   shift). Useful for shortcut (accelerator) key handling (default: "").
    pInputDispatchKeyEventUnmodifiedText :: Maybe T.Text,
    -- | Unique key identifier (e.g., 'U+0041') (default: "").
    pInputDispatchKeyEventKeyIdentifier :: Maybe T.Text,
    -- | Unique DOM defined string value for each physical key (e.g., 'KeyA') (default: "").
    pInputDispatchKeyEventCode :: Maybe T.Text,
    -- | Unique DOM defined string value describing the meaning of the key in the context of active
    --   modifiers, keyboard layout, etc (e.g., 'AltGr') (default: "").
    pInputDispatchKeyEventKey :: Maybe T.Text,
    -- | Windows virtual key code (default: 0).
    pInputDispatchKeyEventWindowsVirtualKeyCode :: Maybe Int,
    -- | Native virtual key code (default: 0).
    pInputDispatchKeyEventNativeVirtualKeyCode :: Maybe Int,
    -- | Whether the event was generated from auto repeat (default: false).
    pInputDispatchKeyEventAutoRepeat :: Maybe Bool,
    -- | Whether the event was generated from the keypad (default: false).
    pInputDispatchKeyEventIsKeypad :: Maybe Bool,
    -- | Whether the event was a system key event (default: false).
    pInputDispatchKeyEventIsSystemKey :: Maybe Bool,
    -- | Whether the event was from the left or right side of the keyboard. 1=Left, 2=Right (default:
    --   0).
    pInputDispatchKeyEventLocation :: Maybe Int,
    -- | Editing commands to send with the key event (e.g., 'selectAll') (default: []).
    --   These are related to but not equal the command names used in `document.execCommand` and NSStandardKeyBindingResponding.
    --   See https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/editing/commands/editor_command_names.h for valid command names.
    pInputDispatchKeyEventCommands :: Maybe [T.Text]
  }
  deriving (Eq, Show)
pInputDispatchKeyEvent
  {-
  -- | Type of the key event.
  -}
  :: PInputDispatchKeyEventType
  -> PInputDispatchKeyEvent
pInputDispatchKeyEvent
  arg_pInputDispatchKeyEventType
  = PInputDispatchKeyEvent
    arg_pInputDispatchKeyEventType
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
instance ToJSON PInputDispatchKeyEvent where
  toJSON p = A.object $ catMaybes [
    ("type" A..=) <$> Just (pInputDispatchKeyEventType p),
    ("modifiers" A..=) <$> (pInputDispatchKeyEventModifiers p),
    ("timestamp" A..=) <$> (pInputDispatchKeyEventTimestamp p),
    ("text" A..=) <$> (pInputDispatchKeyEventText p),
    ("unmodifiedText" A..=) <$> (pInputDispatchKeyEventUnmodifiedText p),
    ("keyIdentifier" A..=) <$> (pInputDispatchKeyEventKeyIdentifier p),
    ("code" A..=) <$> (pInputDispatchKeyEventCode p),
    ("key" A..=) <$> (pInputDispatchKeyEventKey p),
    ("windowsVirtualKeyCode" A..=) <$> (pInputDispatchKeyEventWindowsVirtualKeyCode p),
    ("nativeVirtualKeyCode" A..=) <$> (pInputDispatchKeyEventNativeVirtualKeyCode p),
    ("autoRepeat" A..=) <$> (pInputDispatchKeyEventAutoRepeat p),
    ("isKeypad" A..=) <$> (pInputDispatchKeyEventIsKeypad p),
    ("isSystemKey" A..=) <$> (pInputDispatchKeyEventIsSystemKey p),
    ("location" A..=) <$> (pInputDispatchKeyEventLocation p),
    ("commands" A..=) <$> (pInputDispatchKeyEventCommands p)
    ]
instance Command PInputDispatchKeyEvent where
  type CommandResponse PInputDispatchKeyEvent = ()
  commandName _ = "Input.dispatchKeyEvent"
  fromJSON = const . A.Success . const ()

-- | This method emulates inserting text that doesn't come from a key press,
--   for example an emoji keyboard or an IME.

-- | Parameters of the 'Input.insertText' command.
data PInputInsertText = PInputInsertText
  {
    -- | The text to insert.
    pInputInsertTextText :: T.Text
  }
  deriving (Eq, Show)
pInputInsertText
  {-
  -- | The text to insert.
  -}
  :: T.Text
  -> PInputInsertText
pInputInsertText
  arg_pInputInsertTextText
  = PInputInsertText
    arg_pInputInsertTextText
instance ToJSON PInputInsertText where
  toJSON p = A.object $ catMaybes [
    ("text" A..=) <$> Just (pInputInsertTextText p)
    ]
instance Command PInputInsertText where
  type CommandResponse PInputInsertText = ()
  commandName _ = "Input.insertText"
  fromJSON = const . A.Success . const ()

-- | This method sets the current candidate text for ime.
--   Use imeCommitComposition to commit the final text.
--   Use imeSetComposition with empty string as text to cancel composition.

-- | Parameters of the 'Input.imeSetComposition' command.
data PInputImeSetComposition = PInputImeSetComposition
  {
    -- | The text to insert
    pInputImeSetCompositionText :: T.Text,
    -- | selection start
    pInputImeSetCompositionSelectionStart :: Int,
    -- | selection end
    pInputImeSetCompositionSelectionEnd :: Int,
    -- | replacement start
    pInputImeSetCompositionReplacementStart :: Maybe Int,
    -- | replacement end
    pInputImeSetCompositionReplacementEnd :: Maybe Int
  }
  deriving (Eq, Show)
pInputImeSetComposition
  {-
  -- | The text to insert
  -}
  :: T.Text
  {-
  -- | selection start
  -}
  -> Int
  {-
  -- | selection end
  -}
  -> Int
  -> PInputImeSetComposition
pInputImeSetComposition
  arg_pInputImeSetCompositionText
  arg_pInputImeSetCompositionSelectionStart
  arg_pInputImeSetCompositionSelectionEnd
  = PInputImeSetComposition
    arg_pInputImeSetCompositionText
    arg_pInputImeSetCompositionSelectionStart
    arg_pInputImeSetCompositionSelectionEnd
    Nothing
    Nothing
instance ToJSON PInputImeSetComposition where
  toJSON p = A.object $ catMaybes [
    ("text" A..=) <$> Just (pInputImeSetCompositionText p),
    ("selectionStart" A..=) <$> Just (pInputImeSetCompositionSelectionStart p),
    ("selectionEnd" A..=) <$> Just (pInputImeSetCompositionSelectionEnd p),
    ("replacementStart" A..=) <$> (pInputImeSetCompositionReplacementStart p),
    ("replacementEnd" A..=) <$> (pInputImeSetCompositionReplacementEnd p)
    ]
instance Command PInputImeSetComposition where
  type CommandResponse PInputImeSetComposition = ()
  commandName _ = "Input.imeSetComposition"
  fromJSON = const . A.Success . const ()

-- | Dispatches a mouse event to the page.

-- | Parameters of the 'Input.dispatchMouseEvent' command.
data PInputDispatchMouseEventType = PInputDispatchMouseEventTypeMousePressed | PInputDispatchMouseEventTypeMouseReleased | PInputDispatchMouseEventTypeMouseMoved | PInputDispatchMouseEventTypeMouseWheel
  deriving (Ord, Eq, Show, Read)
instance FromJSON PInputDispatchMouseEventType where
  parseJSON = A.withText "PInputDispatchMouseEventType" $ \v -> case v of
    "mousePressed" -> pure PInputDispatchMouseEventTypeMousePressed
    "mouseReleased" -> pure PInputDispatchMouseEventTypeMouseReleased
    "mouseMoved" -> pure PInputDispatchMouseEventTypeMouseMoved
    "mouseWheel" -> pure PInputDispatchMouseEventTypeMouseWheel
    "_" -> fail "failed to parse PInputDispatchMouseEventType"
instance ToJSON PInputDispatchMouseEventType where
  toJSON v = A.String $ case v of
    PInputDispatchMouseEventTypeMousePressed -> "mousePressed"
    PInputDispatchMouseEventTypeMouseReleased -> "mouseReleased"
    PInputDispatchMouseEventTypeMouseMoved -> "mouseMoved"
    PInputDispatchMouseEventTypeMouseWheel -> "mouseWheel"
data PInputDispatchMouseEventPointerType = PInputDispatchMouseEventPointerTypeMouse | PInputDispatchMouseEventPointerTypePen
  deriving (Ord, Eq, Show, Read)
instance FromJSON PInputDispatchMouseEventPointerType where
  parseJSON = A.withText "PInputDispatchMouseEventPointerType" $ \v -> case v of
    "mouse" -> pure PInputDispatchMouseEventPointerTypeMouse
    "pen" -> pure PInputDispatchMouseEventPointerTypePen
    "_" -> fail "failed to parse PInputDispatchMouseEventPointerType"
instance ToJSON PInputDispatchMouseEventPointerType where
  toJSON v = A.String $ case v of
    PInputDispatchMouseEventPointerTypeMouse -> "mouse"
    PInputDispatchMouseEventPointerTypePen -> "pen"
data PInputDispatchMouseEvent = PInputDispatchMouseEvent
  {
    -- | Type of the mouse event.
    pInputDispatchMouseEventType :: PInputDispatchMouseEventType,
    -- | X coordinate of the event relative to the main frame's viewport in CSS pixels.
    pInputDispatchMouseEventX :: Double,
    -- | Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
    --   the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
    pInputDispatchMouseEventY :: Double,
    -- | Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
    --   (default: 0).
    pInputDispatchMouseEventModifiers :: Maybe Int,
    -- | Time at which the event occurred.
    pInputDispatchMouseEventTimestamp :: Maybe InputTimeSinceEpoch,
    -- | Mouse button (default: "none").
    pInputDispatchMouseEventButton :: Maybe InputMouseButton,
    -- | A number indicating which buttons are pressed on the mouse when a mouse event is triggered.
    --   Left=1, Right=2, Middle=4, Back=8, Forward=16, None=0.
    pInputDispatchMouseEventButtons :: Maybe Int,
    -- | Number of times the mouse button was clicked (default: 0).
    pInputDispatchMouseEventClickCount :: Maybe Int,
    -- | The normalized pressure, which has a range of [0,1] (default: 0).
    pInputDispatchMouseEventForce :: Maybe Double,
    -- | The normalized tangential pressure, which has a range of [-1,1] (default: 0).
    pInputDispatchMouseEventTangentialPressure :: Maybe Double,
    -- | The plane angle between the Y-Z plane and the plane containing both the stylus axis and the Y axis, in degrees of the range [-90,90], a positive tiltX is to the right (default: 0).
    pInputDispatchMouseEventTiltX :: Maybe Int,
    -- | The plane angle between the X-Z plane and the plane containing both the stylus axis and the X axis, in degrees of the range [-90,90], a positive tiltY is towards the user (default: 0).
    pInputDispatchMouseEventTiltY :: Maybe Int,
    -- | The clockwise rotation of a pen stylus around its own major axis, in degrees in the range [0,359] (default: 0).
    pInputDispatchMouseEventTwist :: Maybe Int,
    -- | X delta in CSS pixels for mouse wheel event (default: 0).
    pInputDispatchMouseEventDeltaX :: Maybe Double,
    -- | Y delta in CSS pixels for mouse wheel event (default: 0).
    pInputDispatchMouseEventDeltaY :: Maybe Double,
    -- | Pointer type (default: "mouse").
    pInputDispatchMouseEventPointerType :: Maybe PInputDispatchMouseEventPointerType
  }
  deriving (Eq, Show)
pInputDispatchMouseEvent
  {-
  -- | Type of the mouse event.
  -}
  :: PInputDispatchMouseEventType
  {-
  -- | X coordinate of the event relative to the main frame's viewport in CSS pixels.
  -}
  -> Double
  {-
  -- | Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
  --   the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
  -}
  -> Double
  -> PInputDispatchMouseEvent
pInputDispatchMouseEvent
  arg_pInputDispatchMouseEventType
  arg_pInputDispatchMouseEventX
  arg_pInputDispatchMouseEventY
  = PInputDispatchMouseEvent
    arg_pInputDispatchMouseEventType
    arg_pInputDispatchMouseEventX
    arg_pInputDispatchMouseEventY
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
instance ToJSON PInputDispatchMouseEvent where
  toJSON p = A.object $ catMaybes [
    ("type" A..=) <$> Just (pInputDispatchMouseEventType p),
    ("x" A..=) <$> Just (pInputDispatchMouseEventX p),
    ("y" A..=) <$> Just (pInputDispatchMouseEventY p),
    ("modifiers" A..=) <$> (pInputDispatchMouseEventModifiers p),
    ("timestamp" A..=) <$> (pInputDispatchMouseEventTimestamp p),
    ("button" A..=) <$> (pInputDispatchMouseEventButton p),
    ("buttons" A..=) <$> (pInputDispatchMouseEventButtons p),
    ("clickCount" A..=) <$> (pInputDispatchMouseEventClickCount p),
    ("force" A..=) <$> (pInputDispatchMouseEventForce p),
    ("tangentialPressure" A..=) <$> (pInputDispatchMouseEventTangentialPressure p),
    ("tiltX" A..=) <$> (pInputDispatchMouseEventTiltX p),
    ("tiltY" A..=) <$> (pInputDispatchMouseEventTiltY p),
    ("twist" A..=) <$> (pInputDispatchMouseEventTwist p),
    ("deltaX" A..=) <$> (pInputDispatchMouseEventDeltaX p),
    ("deltaY" A..=) <$> (pInputDispatchMouseEventDeltaY p),
    ("pointerType" A..=) <$> (pInputDispatchMouseEventPointerType p)
    ]
instance Command PInputDispatchMouseEvent where
  type CommandResponse PInputDispatchMouseEvent = ()
  commandName _ = "Input.dispatchMouseEvent"
  fromJSON = const . A.Success . const ()

-- | Dispatches a touch event to the page.

-- | Parameters of the 'Input.dispatchTouchEvent' command.
data PInputDispatchTouchEventType = PInputDispatchTouchEventTypeTouchStart | PInputDispatchTouchEventTypeTouchEnd | PInputDispatchTouchEventTypeTouchMove | PInputDispatchTouchEventTypeTouchCancel
  deriving (Ord, Eq, Show, Read)
instance FromJSON PInputDispatchTouchEventType where
  parseJSON = A.withText "PInputDispatchTouchEventType" $ \v -> case v of
    "touchStart" -> pure PInputDispatchTouchEventTypeTouchStart
    "touchEnd" -> pure PInputDispatchTouchEventTypeTouchEnd
    "touchMove" -> pure PInputDispatchTouchEventTypeTouchMove
    "touchCancel" -> pure PInputDispatchTouchEventTypeTouchCancel
    "_" -> fail "failed to parse PInputDispatchTouchEventType"
instance ToJSON PInputDispatchTouchEventType where
  toJSON v = A.String $ case v of
    PInputDispatchTouchEventTypeTouchStart -> "touchStart"
    PInputDispatchTouchEventTypeTouchEnd -> "touchEnd"
    PInputDispatchTouchEventTypeTouchMove -> "touchMove"
    PInputDispatchTouchEventTypeTouchCancel -> "touchCancel"
data PInputDispatchTouchEvent = PInputDispatchTouchEvent
  {
    -- | Type of the touch event. TouchEnd and TouchCancel must not contain any touch points, while
    --   TouchStart and TouchMove must contains at least one.
    pInputDispatchTouchEventType :: PInputDispatchTouchEventType,
    -- | Active touch points on the touch device. One event per any changed point (compared to
    --   previous touch event in a sequence) is generated, emulating pressing/moving/releasing points
    --   one by one.
    pInputDispatchTouchEventTouchPoints :: [InputTouchPoint],
    -- | Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
    --   (default: 0).
    pInputDispatchTouchEventModifiers :: Maybe Int,
    -- | Time at which the event occurred.
    pInputDispatchTouchEventTimestamp :: Maybe InputTimeSinceEpoch
  }
  deriving (Eq, Show)
pInputDispatchTouchEvent
  {-
  -- | Type of the touch event. TouchEnd and TouchCancel must not contain any touch points, while
  --   TouchStart and TouchMove must contains at least one.
  -}
  :: PInputDispatchTouchEventType
  {-
  -- | Active touch points on the touch device. One event per any changed point (compared to
  --   previous touch event in a sequence) is generated, emulating pressing/moving/releasing points
  --   one by one.
  -}
  -> [InputTouchPoint]
  -> PInputDispatchTouchEvent
pInputDispatchTouchEvent
  arg_pInputDispatchTouchEventType
  arg_pInputDispatchTouchEventTouchPoints
  = PInputDispatchTouchEvent
    arg_pInputDispatchTouchEventType
    arg_pInputDispatchTouchEventTouchPoints
    Nothing
    Nothing
instance ToJSON PInputDispatchTouchEvent where
  toJSON p = A.object $ catMaybes [
    ("type" A..=) <$> Just (pInputDispatchTouchEventType p),
    ("touchPoints" A..=) <$> Just (pInputDispatchTouchEventTouchPoints p),
    ("modifiers" A..=) <$> (pInputDispatchTouchEventModifiers p),
    ("timestamp" A..=) <$> (pInputDispatchTouchEventTimestamp p)
    ]
instance Command PInputDispatchTouchEvent where
  type CommandResponse PInputDispatchTouchEvent = ()
  commandName _ = "Input.dispatchTouchEvent"
  fromJSON = const . A.Success . const ()

-- | Emulates touch event from the mouse event parameters.

-- | Parameters of the 'Input.emulateTouchFromMouseEvent' command.
data PInputEmulateTouchFromMouseEventType = PInputEmulateTouchFromMouseEventTypeMousePressed | PInputEmulateTouchFromMouseEventTypeMouseReleased | PInputEmulateTouchFromMouseEventTypeMouseMoved | PInputEmulateTouchFromMouseEventTypeMouseWheel
  deriving (Ord, Eq, Show, Read)
instance FromJSON PInputEmulateTouchFromMouseEventType where
  parseJSON = A.withText "PInputEmulateTouchFromMouseEventType" $ \v -> case v of
    "mousePressed" -> pure PInputEmulateTouchFromMouseEventTypeMousePressed
    "mouseReleased" -> pure PInputEmulateTouchFromMouseEventTypeMouseReleased
    "mouseMoved" -> pure PInputEmulateTouchFromMouseEventTypeMouseMoved
    "mouseWheel" -> pure PInputEmulateTouchFromMouseEventTypeMouseWheel
    "_" -> fail "failed to parse PInputEmulateTouchFromMouseEventType"
instance ToJSON PInputEmulateTouchFromMouseEventType where
  toJSON v = A.String $ case v of
    PInputEmulateTouchFromMouseEventTypeMousePressed -> "mousePressed"
    PInputEmulateTouchFromMouseEventTypeMouseReleased -> "mouseReleased"
    PInputEmulateTouchFromMouseEventTypeMouseMoved -> "mouseMoved"
    PInputEmulateTouchFromMouseEventTypeMouseWheel -> "mouseWheel"
data PInputEmulateTouchFromMouseEvent = PInputEmulateTouchFromMouseEvent
  {
    -- | Type of the mouse event.
    pInputEmulateTouchFromMouseEventType :: PInputEmulateTouchFromMouseEventType,
    -- | X coordinate of the mouse pointer in DIP.
    pInputEmulateTouchFromMouseEventX :: Int,
    -- | Y coordinate of the mouse pointer in DIP.
    pInputEmulateTouchFromMouseEventY :: Int,
    -- | Mouse button. Only "none", "left", "right" are supported.
    pInputEmulateTouchFromMouseEventButton :: InputMouseButton,
    -- | Time at which the event occurred (default: current time).
    pInputEmulateTouchFromMouseEventTimestamp :: Maybe InputTimeSinceEpoch,
    -- | X delta in DIP for mouse wheel event (default: 0).
    pInputEmulateTouchFromMouseEventDeltaX :: Maybe Double,
    -- | Y delta in DIP for mouse wheel event (default: 0).
    pInputEmulateTouchFromMouseEventDeltaY :: Maybe Double,
    -- | Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
    --   (default: 0).
    pInputEmulateTouchFromMouseEventModifiers :: Maybe Int,
    -- | Number of times the mouse button was clicked (default: 0).
    pInputEmulateTouchFromMouseEventClickCount :: Maybe Int
  }
  deriving (Eq, Show)
pInputEmulateTouchFromMouseEvent
  {-
  -- | Type of the mouse event.
  -}
  :: PInputEmulateTouchFromMouseEventType
  {-
  -- | X coordinate of the mouse pointer in DIP.
  -}
  -> Int
  {-
  -- | Y coordinate of the mouse pointer in DIP.
  -}
  -> Int
  {-
  -- | Mouse button. Only "none", "left", "right" are supported.
  -}
  -> InputMouseButton
  -> PInputEmulateTouchFromMouseEvent
pInputEmulateTouchFromMouseEvent
  arg_pInputEmulateTouchFromMouseEventType
  arg_pInputEmulateTouchFromMouseEventX
  arg_pInputEmulateTouchFromMouseEventY
  arg_pInputEmulateTouchFromMouseEventButton
  = PInputEmulateTouchFromMouseEvent
    arg_pInputEmulateTouchFromMouseEventType
    arg_pInputEmulateTouchFromMouseEventX
    arg_pInputEmulateTouchFromMouseEventY
    arg_pInputEmulateTouchFromMouseEventButton
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
instance ToJSON PInputEmulateTouchFromMouseEvent where
  toJSON p = A.object $ catMaybes [
    ("type" A..=) <$> Just (pInputEmulateTouchFromMouseEventType p),
    ("x" A..=) <$> Just (pInputEmulateTouchFromMouseEventX p),
    ("y" A..=) <$> Just (pInputEmulateTouchFromMouseEventY p),
    ("button" A..=) <$> Just (pInputEmulateTouchFromMouseEventButton p),
    ("timestamp" A..=) <$> (pInputEmulateTouchFromMouseEventTimestamp p),
    ("deltaX" A..=) <$> (pInputEmulateTouchFromMouseEventDeltaX p),
    ("deltaY" A..=) <$> (pInputEmulateTouchFromMouseEventDeltaY p),
    ("modifiers" A..=) <$> (pInputEmulateTouchFromMouseEventModifiers p),
    ("clickCount" A..=) <$> (pInputEmulateTouchFromMouseEventClickCount p)
    ]
instance Command PInputEmulateTouchFromMouseEvent where
  type CommandResponse PInputEmulateTouchFromMouseEvent = ()
  commandName _ = "Input.emulateTouchFromMouseEvent"
  fromJSON = const . A.Success . const ()

-- | Ignores input events (useful while auditing page).

-- | Parameters of the 'Input.setIgnoreInputEvents' command.
data PInputSetIgnoreInputEvents = PInputSetIgnoreInputEvents
  {
    -- | Ignores input events processing when set to true.
    pInputSetIgnoreInputEventsIgnore :: Bool
  }
  deriving (Eq, Show)
pInputSetIgnoreInputEvents
  {-
  -- | Ignores input events processing when set to true.
  -}
  :: Bool
  -> PInputSetIgnoreInputEvents
pInputSetIgnoreInputEvents
  arg_pInputSetIgnoreInputEventsIgnore
  = PInputSetIgnoreInputEvents
    arg_pInputSetIgnoreInputEventsIgnore
instance ToJSON PInputSetIgnoreInputEvents where
  toJSON p = A.object $ catMaybes [
    ("ignore" A..=) <$> Just (pInputSetIgnoreInputEventsIgnore p)
    ]
instance Command PInputSetIgnoreInputEvents where
  type CommandResponse PInputSetIgnoreInputEvents = ()
  commandName _ = "Input.setIgnoreInputEvents"
  fromJSON = const . A.Success . const ()

-- | Prevents default drag and drop behavior and instead emits `Input.dragIntercepted` events.
--   Drag and drop behavior can be directly controlled via `Input.dispatchDragEvent`.

-- | Parameters of the 'Input.setInterceptDrags' command.
data PInputSetInterceptDrags = PInputSetInterceptDrags
  {
    pInputSetInterceptDragsEnabled :: Bool
  }
  deriving (Eq, Show)
pInputSetInterceptDrags
  :: Bool
  -> PInputSetInterceptDrags
pInputSetInterceptDrags
  arg_pInputSetInterceptDragsEnabled
  = PInputSetInterceptDrags
    arg_pInputSetInterceptDragsEnabled
instance ToJSON PInputSetInterceptDrags where
  toJSON p = A.object $ catMaybes [
    ("enabled" A..=) <$> Just (pInputSetInterceptDragsEnabled p)
    ]
instance Command PInputSetInterceptDrags where
  type CommandResponse PInputSetInterceptDrags = ()
  commandName _ = "Input.setInterceptDrags"
  fromJSON = const . A.Success . const ()

-- | Synthesizes a pinch gesture over a time period by issuing appropriate touch events.

-- | Parameters of the 'Input.synthesizePinchGesture' command.
data PInputSynthesizePinchGesture = PInputSynthesizePinchGesture
  {
    -- | X coordinate of the start of the gesture in CSS pixels.
    pInputSynthesizePinchGestureX :: Double,
    -- | Y coordinate of the start of the gesture in CSS pixels.
    pInputSynthesizePinchGestureY :: Double,
    -- | Relative scale factor after zooming (>1.0 zooms in, <1.0 zooms out).
    pInputSynthesizePinchGestureScaleFactor :: Double,
    -- | Relative pointer speed in pixels per second (default: 800).
    pInputSynthesizePinchGestureRelativeSpeed :: Maybe Int,
    -- | Which type of input events to be generated (default: 'default', which queries the platform
    --   for the preferred input type).
    pInputSynthesizePinchGestureGestureSourceType :: Maybe InputGestureSourceType
  }
  deriving (Eq, Show)
pInputSynthesizePinchGesture
  {-
  -- | X coordinate of the start of the gesture in CSS pixels.
  -}
  :: Double
  {-
  -- | Y coordinate of the start of the gesture in CSS pixels.
  -}
  -> Double
  {-
  -- | Relative scale factor after zooming (>1.0 zooms in, <1.0 zooms out).
  -}
  -> Double
  -> PInputSynthesizePinchGesture
pInputSynthesizePinchGesture
  arg_pInputSynthesizePinchGestureX
  arg_pInputSynthesizePinchGestureY
  arg_pInputSynthesizePinchGestureScaleFactor
  = PInputSynthesizePinchGesture
    arg_pInputSynthesizePinchGestureX
    arg_pInputSynthesizePinchGestureY
    arg_pInputSynthesizePinchGestureScaleFactor
    Nothing
    Nothing
instance ToJSON PInputSynthesizePinchGesture where
  toJSON p = A.object $ catMaybes [
    ("x" A..=) <$> Just (pInputSynthesizePinchGestureX p),
    ("y" A..=) <$> Just (pInputSynthesizePinchGestureY p),
    ("scaleFactor" A..=) <$> Just (pInputSynthesizePinchGestureScaleFactor p),
    ("relativeSpeed" A..=) <$> (pInputSynthesizePinchGestureRelativeSpeed p),
    ("gestureSourceType" A..=) <$> (pInputSynthesizePinchGestureGestureSourceType p)
    ]
instance Command PInputSynthesizePinchGesture where
  type CommandResponse PInputSynthesizePinchGesture = ()
  commandName _ = "Input.synthesizePinchGesture"
  fromJSON = const . A.Success . const ()

-- | Synthesizes a scroll gesture over a time period by issuing appropriate touch events.

-- | Parameters of the 'Input.synthesizeScrollGesture' command.
data PInputSynthesizeScrollGesture = PInputSynthesizeScrollGesture
  {
    -- | X coordinate of the start of the gesture in CSS pixels.
    pInputSynthesizeScrollGestureX :: Double,
    -- | Y coordinate of the start of the gesture in CSS pixels.
    pInputSynthesizeScrollGestureY :: Double,
    -- | The distance to scroll along the X axis (positive to scroll left).
    pInputSynthesizeScrollGestureXDistance :: Maybe Double,
    -- | The distance to scroll along the Y axis (positive to scroll up).
    pInputSynthesizeScrollGestureYDistance :: Maybe Double,
    -- | The number of additional pixels to scroll back along the X axis, in addition to the given
    --   distance.
    pInputSynthesizeScrollGestureXOverscroll :: Maybe Double,
    -- | The number of additional pixels to scroll back along the Y axis, in addition to the given
    --   distance.
    pInputSynthesizeScrollGestureYOverscroll :: Maybe Double,
    -- | Prevent fling (default: true).
    pInputSynthesizeScrollGesturePreventFling :: Maybe Bool,
    -- | Swipe speed in pixels per second (default: 800).
    pInputSynthesizeScrollGestureSpeed :: Maybe Int,
    -- | Which type of input events to be generated (default: 'default', which queries the platform
    --   for the preferred input type).
    pInputSynthesizeScrollGestureGestureSourceType :: Maybe InputGestureSourceType,
    -- | The number of times to repeat the gesture (default: 0).
    pInputSynthesizeScrollGestureRepeatCount :: Maybe Int,
    -- | The number of milliseconds delay between each repeat. (default: 250).
    pInputSynthesizeScrollGestureRepeatDelayMs :: Maybe Int,
    -- | The name of the interaction markers to generate, if not empty (default: "").
    pInputSynthesizeScrollGestureInteractionMarkerName :: Maybe T.Text
  }
  deriving (Eq, Show)
pInputSynthesizeScrollGesture
  {-
  -- | X coordinate of the start of the gesture in CSS pixels.
  -}
  :: Double
  {-
  -- | Y coordinate of the start of the gesture in CSS pixels.
  -}
  -> Double
  -> PInputSynthesizeScrollGesture
pInputSynthesizeScrollGesture
  arg_pInputSynthesizeScrollGestureX
  arg_pInputSynthesizeScrollGestureY
  = PInputSynthesizeScrollGesture
    arg_pInputSynthesizeScrollGestureX
    arg_pInputSynthesizeScrollGestureY
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
    Nothing
instance ToJSON PInputSynthesizeScrollGesture where
  toJSON p = A.object $ catMaybes [
    ("x" A..=) <$> Just (pInputSynthesizeScrollGestureX p),
    ("y" A..=) <$> Just (pInputSynthesizeScrollGestureY p),
    ("xDistance" A..=) <$> (pInputSynthesizeScrollGestureXDistance p),
    ("yDistance" A..=) <$> (pInputSynthesizeScrollGestureYDistance p),
    ("xOverscroll" A..=) <$> (pInputSynthesizeScrollGestureXOverscroll p),
    ("yOverscroll" A..=) <$> (pInputSynthesizeScrollGestureYOverscroll p),
    ("preventFling" A..=) <$> (pInputSynthesizeScrollGesturePreventFling p),
    ("speed" A..=) <$> (pInputSynthesizeScrollGestureSpeed p),
    ("gestureSourceType" A..=) <$> (pInputSynthesizeScrollGestureGestureSourceType p),
    ("repeatCount" A..=) <$> (pInputSynthesizeScrollGestureRepeatCount p),
    ("repeatDelayMs" A..=) <$> (pInputSynthesizeScrollGestureRepeatDelayMs p),
    ("interactionMarkerName" A..=) <$> (pInputSynthesizeScrollGestureInteractionMarkerName p)
    ]
instance Command PInputSynthesizeScrollGesture where
  type CommandResponse PInputSynthesizeScrollGesture = ()
  commandName _ = "Input.synthesizeScrollGesture"
  fromJSON = const . A.Success . const ()

-- | Synthesizes a tap gesture over a time period by issuing appropriate touch events.

-- | Parameters of the 'Input.synthesizeTapGesture' command.
data PInputSynthesizeTapGesture = PInputSynthesizeTapGesture
  {
    -- | X coordinate of the start of the gesture in CSS pixels.
    pInputSynthesizeTapGestureX :: Double,
    -- | Y coordinate of the start of the gesture in CSS pixels.
    pInputSynthesizeTapGestureY :: Double,
    -- | Duration between touchdown and touchup events in ms (default: 50).
    pInputSynthesizeTapGestureDuration :: Maybe Int,
    -- | Number of times to perform the tap (e.g. 2 for double tap, default: 1).
    pInputSynthesizeTapGestureTapCount :: Maybe Int,
    -- | Which type of input events to be generated (default: 'default', which queries the platform
    --   for the preferred input type).
    pInputSynthesizeTapGestureGestureSourceType :: Maybe InputGestureSourceType
  }
  deriving (Eq, Show)
pInputSynthesizeTapGesture
  {-
  -- | X coordinate of the start of the gesture in CSS pixels.
  -}
  :: Double
  {-
  -- | Y coordinate of the start of the gesture in CSS pixels.
  -}
  -> Double
  -> PInputSynthesizeTapGesture
pInputSynthesizeTapGesture
  arg_pInputSynthesizeTapGestureX
  arg_pInputSynthesizeTapGestureY
  = PInputSynthesizeTapGesture
    arg_pInputSynthesizeTapGestureX
    arg_pInputSynthesizeTapGestureY
    Nothing
    Nothing
    Nothing
instance ToJSON PInputSynthesizeTapGesture where
  toJSON p = A.object $ catMaybes [
    ("x" A..=) <$> Just (pInputSynthesizeTapGestureX p),
    ("y" A..=) <$> Just (pInputSynthesizeTapGestureY p),
    ("duration" A..=) <$> (pInputSynthesizeTapGestureDuration p),
    ("tapCount" A..=) <$> (pInputSynthesizeTapGestureTapCount p),
    ("gestureSourceType" A..=) <$> (pInputSynthesizeTapGestureGestureSourceType p)
    ]
instance Command PInputSynthesizeTapGesture where
  type CommandResponse PInputSynthesizeTapGesture = ()
  commandName _ = "Input.synthesizeTapGesture"
  fromJSON = const . A.Success . const ()

