{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} module HipChat.Types.Dialog where import Data.Aeson import Data.Aeson.Casing import Data.Aeson.Types import Data.Text (Text) import GHC.Generics import HipChat.Types.Name data Dialog = Dialog { dialogKey :: Text , dialogTitle :: Name , dialogUrl :: Text , dialogOptions :: Maybe DialogOptions } deriving (Show, Eq, Generic) defaultDialog :: Text -> Name -> Text -> Dialog defaultDialog k t u = Dialog k t u Nothing instance ToJSON Dialog where toJSON = genericToJSON $ aesonPrefix camelCase instance FromJSON Dialog where parseJSON = genericParseJSON $ aesonPrefix camelCase data DialogStyle = Normal | Warning deriving (Show, Eq) instance ToJSON DialogStyle where toJSON Normal = "normal" toJSON Warning = "warning" instance FromJSON DialogStyle where parseJSON (String "normal") = return Normal parseJSON (String "warning") = return Warning parseJSON (String text) = fail ("Unexpected style string: " ++ show text) parseJSON x = typeMismatch "Invalid style" x data DialogOptions = DialogOptions { dialogoptionsStyle :: Maybe DialogStyle , dialogoptionsPrimaryAction :: Maybe DialogAction , dialogoptionsSecondaryActions :: Maybe [DialogAction] , dialogoptionsSize :: Maybe DialogSize , dialogoptionsHint :: Maybe Name , dialogoptionsFilter :: Maybe DialogFilter } deriving (Show, Eq, Generic) instance ToJSON DialogOptions where toJSON = genericToJSON $ aesonPrefix camelCase instance FromJSON DialogOptions where parseJSON = genericParseJSON $ aesonPrefix camelCase defaultDialogOptions :: DialogOptions defaultDialogOptions = DialogOptions Nothing Nothing Nothing Nothing Nothing Nothing data DialogAction = DialogAction { dialogactionName :: Name , dialogactionEnabled :: Bool , dialogactionKey :: Maybe Text } deriving (Show, Eq, Generic) instance ToJSON DialogAction where toJSON = genericToJSON $ aesonPrefix camelCase instance FromJSON DialogAction where parseJSON = genericParseJSON $ aesonPrefix camelCase data DialogSize = DialogSize { dialogsizeHeight :: Text -- Either 'px' or '%' , dialogsizeWidth :: Text -- Either 'px' or '%' } deriving (Show, Eq, Generic) instance ToJSON DialogSize where toJSON = genericToJSON $ aesonPrefix camelCase instance FromJSON DialogSize where parseJSON = genericParseJSON $ aesonPrefix camelCase data DialogFilter = DialogFilter { dialogfilterPlaceholder :: Name } deriving (Show, Eq, Generic) instance ToJSON DialogFilter where toJSON = genericToJSON $ aesonPrefix camelCase instance FromJSON DialogFilter where parseJSON = genericParseJSON $ aesonPrefix camelCase