{-# LANGUAGE UnicodeSyntax #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeApplications #-}

{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# HLINT ignore "Use camelCase" #-}

module MatrixBot.Bot.BotConfig
  ( BotConfig (..)
  , BotConfigReactToUsers (..)

  , BotConfigReplyToMedia (..)
  , BotConfigReplyToMedia_MessageTemplateEntry (..)
  , BotConfigReplyToMedia_DynamicFieldName (..)
  , BotConfigReplyToMedia_DynamicExtractedValueName (..)
  ) where

import qualified Data.Aeson as J
import qualified Data.Aeson.KeyMap as KeyMap
import qualified Data.Aeson.Types as J
import Data.Data (Proxy (Proxy))
import Data.List (find)
import qualified Data.List.NonEmpty as NE
import Data.Text (Text)
import Data.Typeable (Typeable, typeRep)
import GHC.Generics (Generic)
import MatrixBot.AesonUtils (myGenericToJSON, myGenericParseJSON)
import MatrixBot.Bot.EventsListener.Filters (UsersFilter, RoomsFilter, MediaMsgtypeFilter)


-- | Bot configuration
--
-- Note that feature configuration is a list of entries.
-- It means a list of filters and applied action in case a filter is matching.
-- An event will go through all such entries and apply each that would have its
-- filter matching the event.
data BotConfig = BotConfig
  { BotConfig -> Maybe [BotConfigReactToUsers]
botConfigReactToUsers  Maybe [BotConfigReactToUsers]
  , BotConfig -> Maybe [BotConfigReplyToMedia]
botConfigReplyToMedia  Maybe [BotConfigReplyToMedia]
  }
  deriving stock ((forall x. BotConfig -> Rep BotConfig x)
-> (forall x. Rep BotConfig x -> BotConfig) -> Generic BotConfig
forall x. Rep BotConfig x -> BotConfig
forall x. BotConfig -> Rep BotConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BotConfig -> Rep BotConfig x
from :: forall x. BotConfig -> Rep BotConfig x
$cto :: forall x. Rep BotConfig x -> BotConfig
to :: forall x. Rep BotConfig x -> BotConfig
Generic, BotConfig -> BotConfig -> Bool
(BotConfig -> BotConfig -> Bool)
-> (BotConfig -> BotConfig -> Bool) -> Eq BotConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotConfig -> BotConfig -> Bool
== :: BotConfig -> BotConfig -> Bool
$c/= :: BotConfig -> BotConfig -> Bool
/= :: BotConfig -> BotConfig -> Bool
Eq, Int -> BotConfig -> ShowS
[BotConfig] -> ShowS
BotConfig -> String
(Int -> BotConfig -> ShowS)
-> (BotConfig -> String)
-> ([BotConfig] -> ShowS)
-> Show BotConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BotConfig -> ShowS
showsPrec :: Int -> BotConfig -> ShowS
$cshow :: BotConfig -> String
show :: BotConfig -> String
$cshowList :: [BotConfig] -> ShowS
showList :: [BotConfig] -> ShowS
Show)

instance J.ToJSON BotConfig where toJSON :: BotConfig -> Value
toJSON = BotConfig -> Value
forall a.
(Generic a, Typeable a, GToJSON' Value Zero (Rep a)) =>
a -> Value
myGenericToJSON
instance J.FromJSON BotConfig where parseJSON :: Value -> Parser BotConfig
parseJSON = Value -> Parser BotConfig
forall a.
(Generic a, Typeable a, GFromJSON Zero (Rep a)) =>
Value -> Parser a
myGenericParseJSON


-- | Bot configuration entry for “react-to-users" feature
data BotConfigReactToUsers = BotConfigReactToUsers
  { BotConfigReactToUsers -> Maybe UsersFilter
botConfigReactToUsersUsersFilter  Maybe UsersFilter
  , BotConfigReactToUsers -> Maybe RoomsFilter
botConfigReactToUsersRoomsFilter  Maybe RoomsFilter

  , BotConfigReactToUsers -> NonEmpty Text
botConfigReactToUsersLeaveReactions  NE.NonEmpty Text
  -- ^ A list of reactions to leave for an event
  --   (a list of reactions must be non-empty,
  --   otherwise the whole section does not make sense)
  }
  deriving stock ((forall x. BotConfigReactToUsers -> Rep BotConfigReactToUsers x)
-> (forall x. Rep BotConfigReactToUsers x -> BotConfigReactToUsers)
-> Generic BotConfigReactToUsers
forall x. Rep BotConfigReactToUsers x -> BotConfigReactToUsers
forall x. BotConfigReactToUsers -> Rep BotConfigReactToUsers x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BotConfigReactToUsers -> Rep BotConfigReactToUsers x
from :: forall x. BotConfigReactToUsers -> Rep BotConfigReactToUsers x
$cto :: forall x. Rep BotConfigReactToUsers x -> BotConfigReactToUsers
to :: forall x. Rep BotConfigReactToUsers x -> BotConfigReactToUsers
Generic, BotConfigReactToUsers -> BotConfigReactToUsers -> Bool
(BotConfigReactToUsers -> BotConfigReactToUsers -> Bool)
-> (BotConfigReactToUsers -> BotConfigReactToUsers -> Bool)
-> Eq BotConfigReactToUsers
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotConfigReactToUsers -> BotConfigReactToUsers -> Bool
== :: BotConfigReactToUsers -> BotConfigReactToUsers -> Bool
$c/= :: BotConfigReactToUsers -> BotConfigReactToUsers -> Bool
/= :: BotConfigReactToUsers -> BotConfigReactToUsers -> Bool
Eq, Int -> BotConfigReactToUsers -> ShowS
[BotConfigReactToUsers] -> ShowS
BotConfigReactToUsers -> String
(Int -> BotConfigReactToUsers -> ShowS)
-> (BotConfigReactToUsers -> String)
-> ([BotConfigReactToUsers] -> ShowS)
-> Show BotConfigReactToUsers
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BotConfigReactToUsers -> ShowS
showsPrec :: Int -> BotConfigReactToUsers -> ShowS
$cshow :: BotConfigReactToUsers -> String
show :: BotConfigReactToUsers -> String
$cshowList :: [BotConfigReactToUsers] -> ShowS
showList :: [BotConfigReactToUsers] -> ShowS
Show)

instance J.ToJSON BotConfigReactToUsers where toJSON :: BotConfigReactToUsers -> Value
toJSON = BotConfigReactToUsers -> Value
forall a.
(Generic a, Typeable a, GToJSON' Value Zero (Rep a)) =>
a -> Value
myGenericToJSON
instance J.FromJSON BotConfigReactToUsers where parseJSON :: Value -> Parser BotConfigReactToUsers
parseJSON = Value -> Parser BotConfigReactToUsers
forall a.
(Generic a, Typeable a, GFromJSON Zero (Rep a)) =>
Value -> Parser a
myGenericParseJSON


-- | Bot configuration entry for “reply-to-media" feature
data BotConfigReplyToMedia = BotConfigReplyToMedia
  { BotConfigReplyToMedia -> Maybe UsersFilter
botConfigReplyToMediaUsersFilter  Maybe UsersFilter
  , BotConfigReplyToMedia -> Maybe RoomsFilter
botConfigReplyToMediaRoomsFilter  Maybe RoomsFilter
  , BotConfigReplyToMedia -> Maybe MediaMsgtypeFilter
botConfigReplyToMediaMsgtypeFilter  Maybe MediaMsgtypeFilter

  , BotConfigReplyToMedia
-> [BotConfigReplyToMedia_MessageTemplateEntry]
botConfigReplyToMediaMessageTemplate  [BotConfigReplyToMedia_MessageTemplateEntry]
  -- ^ Message template, a list of entries that will be just concatenated
  , BotConfigReplyToMedia
-> Maybe [BotConfigReplyToMedia_MessageTemplateEntry]
botConfigReplyToMediaHtmlMessageTemplate  Maybe [BotConfigReplyToMedia_MessageTemplateEntry]
  -- ^ Optional HTML-formatted message template, to be paired with the plain text template
  }
  deriving stock ((forall x. BotConfigReplyToMedia -> Rep BotConfigReplyToMedia x)
-> (forall x. Rep BotConfigReplyToMedia x -> BotConfigReplyToMedia)
-> Generic BotConfigReplyToMedia
forall x. Rep BotConfigReplyToMedia x -> BotConfigReplyToMedia
forall x. BotConfigReplyToMedia -> Rep BotConfigReplyToMedia x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BotConfigReplyToMedia -> Rep BotConfigReplyToMedia x
from :: forall x. BotConfigReplyToMedia -> Rep BotConfigReplyToMedia x
$cto :: forall x. Rep BotConfigReplyToMedia x -> BotConfigReplyToMedia
to :: forall x. Rep BotConfigReplyToMedia x -> BotConfigReplyToMedia
Generic, BotConfigReplyToMedia -> BotConfigReplyToMedia -> Bool
(BotConfigReplyToMedia -> BotConfigReplyToMedia -> Bool)
-> (BotConfigReplyToMedia -> BotConfigReplyToMedia -> Bool)
-> Eq BotConfigReplyToMedia
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotConfigReplyToMedia -> BotConfigReplyToMedia -> Bool
== :: BotConfigReplyToMedia -> BotConfigReplyToMedia -> Bool
$c/= :: BotConfigReplyToMedia -> BotConfigReplyToMedia -> Bool
/= :: BotConfigReplyToMedia -> BotConfigReplyToMedia -> Bool
Eq, Int -> BotConfigReplyToMedia -> ShowS
[BotConfigReplyToMedia] -> ShowS
BotConfigReplyToMedia -> String
(Int -> BotConfigReplyToMedia -> ShowS)
-> (BotConfigReplyToMedia -> String)
-> ([BotConfigReplyToMedia] -> ShowS)
-> Show BotConfigReplyToMedia
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BotConfigReplyToMedia -> ShowS
showsPrec :: Int -> BotConfigReplyToMedia -> ShowS
$cshow :: BotConfigReplyToMedia -> String
show :: BotConfigReplyToMedia -> String
$cshowList :: [BotConfigReplyToMedia] -> ShowS
showList :: [BotConfigReplyToMedia] -> ShowS
Show)

instance J.ToJSON BotConfigReplyToMedia where toJSON :: BotConfigReplyToMedia -> Value
toJSON = BotConfigReplyToMedia -> Value
forall a.
(Generic a, Typeable a, GToJSON' Value Zero (Rep a)) =>
a -> Value
myGenericToJSON
instance J.FromJSON BotConfigReplyToMedia where parseJSON :: Value -> Parser BotConfigReplyToMedia
parseJSON = Value -> Parser BotConfigReplyToMedia
forall a.
(Generic a, Typeable a, GFromJSON Zero (Rep a)) =>
Value -> Parser a
myGenericParseJSON


-- | Either a plain string or a special entry for a dynamic value substitution
data BotConfigReplyToMedia_MessageTemplateEntry
  = BotConfigReplyToMedia_MessageTemplateEntry_PlainString
      Text
  | BotConfigReplyToMedia_MessageTemplateEntry_DynamicSubstitution_Field
      BotConfigReplyToMedia_DynamicFieldName
  | BotConfigReplyToMedia_MessageTemplateEntry_DynamicSubstitution_ExtractedValue
      BotConfigReplyToMedia_DynamicExtractedValueName
  deriving stock ((forall x.
 BotConfigReplyToMedia_MessageTemplateEntry
 -> Rep BotConfigReplyToMedia_MessageTemplateEntry x)
-> (forall x.
    Rep BotConfigReplyToMedia_MessageTemplateEntry x
    -> BotConfigReplyToMedia_MessageTemplateEntry)
-> Generic BotConfigReplyToMedia_MessageTemplateEntry
forall x.
Rep BotConfigReplyToMedia_MessageTemplateEntry x
-> BotConfigReplyToMedia_MessageTemplateEntry
forall x.
BotConfigReplyToMedia_MessageTemplateEntry
-> Rep BotConfigReplyToMedia_MessageTemplateEntry x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
BotConfigReplyToMedia_MessageTemplateEntry
-> Rep BotConfigReplyToMedia_MessageTemplateEntry x
from :: forall x.
BotConfigReplyToMedia_MessageTemplateEntry
-> Rep BotConfigReplyToMedia_MessageTemplateEntry x
$cto :: forall x.
Rep BotConfigReplyToMedia_MessageTemplateEntry x
-> BotConfigReplyToMedia_MessageTemplateEntry
to :: forall x.
Rep BotConfigReplyToMedia_MessageTemplateEntry x
-> BotConfigReplyToMedia_MessageTemplateEntry
Generic, BotConfigReplyToMedia_MessageTemplateEntry
-> BotConfigReplyToMedia_MessageTemplateEntry -> Bool
(BotConfigReplyToMedia_MessageTemplateEntry
 -> BotConfigReplyToMedia_MessageTemplateEntry -> Bool)
-> (BotConfigReplyToMedia_MessageTemplateEntry
    -> BotConfigReplyToMedia_MessageTemplateEntry -> Bool)
-> Eq BotConfigReplyToMedia_MessageTemplateEntry
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotConfigReplyToMedia_MessageTemplateEntry
-> BotConfigReplyToMedia_MessageTemplateEntry -> Bool
== :: BotConfigReplyToMedia_MessageTemplateEntry
-> BotConfigReplyToMedia_MessageTemplateEntry -> Bool
$c/= :: BotConfigReplyToMedia_MessageTemplateEntry
-> BotConfigReplyToMedia_MessageTemplateEntry -> Bool
/= :: BotConfigReplyToMedia_MessageTemplateEntry
-> BotConfigReplyToMedia_MessageTemplateEntry -> Bool
Eq, Int -> BotConfigReplyToMedia_MessageTemplateEntry -> ShowS
[BotConfigReplyToMedia_MessageTemplateEntry] -> ShowS
BotConfigReplyToMedia_MessageTemplateEntry -> String
(Int -> BotConfigReplyToMedia_MessageTemplateEntry -> ShowS)
-> (BotConfigReplyToMedia_MessageTemplateEntry -> String)
-> ([BotConfigReplyToMedia_MessageTemplateEntry] -> ShowS)
-> Show BotConfigReplyToMedia_MessageTemplateEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BotConfigReplyToMedia_MessageTemplateEntry -> ShowS
showsPrec :: Int -> BotConfigReplyToMedia_MessageTemplateEntry -> ShowS
$cshow :: BotConfigReplyToMedia_MessageTemplateEntry -> String
show :: BotConfigReplyToMedia_MessageTemplateEntry -> String
$cshowList :: [BotConfigReplyToMedia_MessageTemplateEntry] -> ShowS
showList :: [BotConfigReplyToMedia_MessageTemplateEntry] -> ShowS
Show)

instance J.ToJSON BotConfigReplyToMedia_MessageTemplateEntry where
  toJSON :: BotConfigReplyToMedia_MessageTemplateEntry -> Value
toJSON (BotConfigReplyToMedia_MessageTemplateEntry_PlainString Text
x) = Text -> Value
forall a. ToJSON a => a -> Value
J.toJSON Text
x
  toJSON (BotConfigReplyToMedia_MessageTemplateEntry_DynamicSubstitution_Field BotConfigReplyToMedia_DynamicFieldName
x) =
    Object -> Value
J.Object (Object -> Value) -> Object -> Value
forall a b. (a -> b) -> a -> b
$ Key -> Value -> Object
forall v. Key -> v -> KeyMap v
KeyMap.singleton Key
"field" (BotConfigReplyToMedia_DynamicFieldName -> Value
forall a. ToJSON a => a -> Value
J.toJSON BotConfigReplyToMedia_DynamicFieldName
x)
  toJSON (BotConfigReplyToMedia_MessageTemplateEntry_DynamicSubstitution_ExtractedValue BotConfigReplyToMedia_DynamicExtractedValueName
x) =
    Object -> Value
J.Object (Object -> Value) -> Object -> Value
forall a b. (a -> b) -> a -> b
$ Key -> Value -> Object
forall v. Key -> v -> KeyMap v
KeyMap.singleton Key
"extracted_value" (BotConfigReplyToMedia_DynamicExtractedValueName -> Value
forall a. ToJSON a => a -> Value
J.toJSON BotConfigReplyToMedia_DynamicExtractedValueName
x)

instance J.FromJSON BotConfigReplyToMedia_MessageTemplateEntry where
  parseJSON :: Value -> Parser BotConfigReplyToMedia_MessageTemplateEntry
parseJSON (J.String Text
x) = BotConfigReplyToMedia_MessageTemplateEntry
-> Parser BotConfigReplyToMedia_MessageTemplateEntry
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (BotConfigReplyToMedia_MessageTemplateEntry
 -> Parser BotConfigReplyToMedia_MessageTemplateEntry)
-> BotConfigReplyToMedia_MessageTemplateEntry
-> Parser BotConfigReplyToMedia_MessageTemplateEntry
forall a b. (a -> b) -> a -> b
$ Text -> BotConfigReplyToMedia_MessageTemplateEntry
BotConfigReplyToMedia_MessageTemplateEntry_PlainString Text
x
  parseJSON Value
jsonValue
    = ([BotConfigReplyToMedia_MessageTemplateEntry]
 -> Value -> Parser BotConfigReplyToMedia_MessageTemplateEntry)
-> Value
-> [BotConfigReplyToMedia_MessageTemplateEntry]
-> Parser BotConfigReplyToMedia_MessageTemplateEntry
forall a b c. (a -> b -> c) -> b -> a -> c
flip [BotConfigReplyToMedia_MessageTemplateEntry]
-> Value -> Parser BotConfigReplyToMedia_MessageTemplateEntry
forall a. (Typeable a, ToJSON a) => [a] -> Value -> Parser a
parseJsonFromVariantsEqualityCheck Value
jsonValue
    ([BotConfigReplyToMedia_MessageTemplateEntry]
 -> Parser BotConfigReplyToMedia_MessageTemplateEntry)
-> [BotConfigReplyToMedia_MessageTemplateEntry]
-> Parser BotConfigReplyToMedia_MessageTemplateEntry
forall a b. (a -> b) -> a -> b
$ [BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_MessageTemplateEntry
BotConfigReplyToMedia_MessageTemplateEntry_DynamicSubstitution_Field BotConfigReplyToMedia_DynamicFieldName
x | BotConfigReplyToMedia_DynamicFieldName
x  [BotConfigReplyToMedia_DynamicFieldName
forall a. Bounded a => a
minBound .. BotConfigReplyToMedia_DynamicFieldName
forall a. Bounded a => a
maxBound]]
    [BotConfigReplyToMedia_MessageTemplateEntry]
-> [BotConfigReplyToMedia_MessageTemplateEntry]
-> [BotConfigReplyToMedia_MessageTemplateEntry]
forall a. Semigroup a => a -> a -> a
<> [BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_MessageTemplateEntry
BotConfigReplyToMedia_MessageTemplateEntry_DynamicSubstitution_ExtractedValue BotConfigReplyToMedia_DynamicExtractedValueName
x | BotConfigReplyToMedia_DynamicExtractedValueName
x  [BotConfigReplyToMedia_DynamicExtractedValueName
forall a. Bounded a => a
minBound .. BotConfigReplyToMedia_DynamicExtractedValueName
forall a. Bounded a => a
maxBound]]


data BotConfigReplyToMedia_DynamicFieldName
  = BotConfigReplyToMedia_DynamicFieldName_MsgType
  -- ^ @msgtype@ — For example @m.image@
  | BotConfigReplyToMedia_DynamicFieldName_Body
  -- ^ @body@ — Contains file name
  | BotConfigReplyToMedia_DynamicFieldName_Url
  -- ^ @body@ — Contains file name
  deriving stock ((forall x.
 BotConfigReplyToMedia_DynamicFieldName
 -> Rep BotConfigReplyToMedia_DynamicFieldName x)
-> (forall x.
    Rep BotConfigReplyToMedia_DynamicFieldName x
    -> BotConfigReplyToMedia_DynamicFieldName)
-> Generic BotConfigReplyToMedia_DynamicFieldName
forall x.
Rep BotConfigReplyToMedia_DynamicFieldName x
-> BotConfigReplyToMedia_DynamicFieldName
forall x.
BotConfigReplyToMedia_DynamicFieldName
-> Rep BotConfigReplyToMedia_DynamicFieldName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
BotConfigReplyToMedia_DynamicFieldName
-> Rep BotConfigReplyToMedia_DynamicFieldName x
from :: forall x.
BotConfigReplyToMedia_DynamicFieldName
-> Rep BotConfigReplyToMedia_DynamicFieldName x
$cto :: forall x.
Rep BotConfigReplyToMedia_DynamicFieldName x
-> BotConfigReplyToMedia_DynamicFieldName
to :: forall x.
Rep BotConfigReplyToMedia_DynamicFieldName x
-> BotConfigReplyToMedia_DynamicFieldName
Generic, BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName -> Bool
(BotConfigReplyToMedia_DynamicFieldName
 -> BotConfigReplyToMedia_DynamicFieldName -> Bool)
-> (BotConfigReplyToMedia_DynamicFieldName
    -> BotConfigReplyToMedia_DynamicFieldName -> Bool)
-> Eq BotConfigReplyToMedia_DynamicFieldName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName -> Bool
== :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName -> Bool
$c/= :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName -> Bool
/= :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName -> Bool
Eq, Int -> BotConfigReplyToMedia_DynamicFieldName -> ShowS
[BotConfigReplyToMedia_DynamicFieldName] -> ShowS
BotConfigReplyToMedia_DynamicFieldName -> String
(Int -> BotConfigReplyToMedia_DynamicFieldName -> ShowS)
-> (BotConfigReplyToMedia_DynamicFieldName -> String)
-> ([BotConfigReplyToMedia_DynamicFieldName] -> ShowS)
-> Show BotConfigReplyToMedia_DynamicFieldName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BotConfigReplyToMedia_DynamicFieldName -> ShowS
showsPrec :: Int -> BotConfigReplyToMedia_DynamicFieldName -> ShowS
$cshow :: BotConfigReplyToMedia_DynamicFieldName -> String
show :: BotConfigReplyToMedia_DynamicFieldName -> String
$cshowList :: [BotConfigReplyToMedia_DynamicFieldName] -> ShowS
showList :: [BotConfigReplyToMedia_DynamicFieldName] -> ShowS
Show, BotConfigReplyToMedia_DynamicFieldName
BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> Bounded BotConfigReplyToMedia_DynamicFieldName
forall a. a -> a -> Bounded a
$cminBound :: BotConfigReplyToMedia_DynamicFieldName
minBound :: BotConfigReplyToMedia_DynamicFieldName
$cmaxBound :: BotConfigReplyToMedia_DynamicFieldName
maxBound :: BotConfigReplyToMedia_DynamicFieldName
Bounded, Int -> BotConfigReplyToMedia_DynamicFieldName
BotConfigReplyToMedia_DynamicFieldName -> Int
BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
(BotConfigReplyToMedia_DynamicFieldName
 -> BotConfigReplyToMedia_DynamicFieldName)
-> (BotConfigReplyToMedia_DynamicFieldName
    -> BotConfigReplyToMedia_DynamicFieldName)
-> (Int -> BotConfigReplyToMedia_DynamicFieldName)
-> (BotConfigReplyToMedia_DynamicFieldName -> Int)
-> (BotConfigReplyToMedia_DynamicFieldName
    -> [BotConfigReplyToMedia_DynamicFieldName])
-> (BotConfigReplyToMedia_DynamicFieldName
    -> BotConfigReplyToMedia_DynamicFieldName
    -> [BotConfigReplyToMedia_DynamicFieldName])
-> (BotConfigReplyToMedia_DynamicFieldName
    -> BotConfigReplyToMedia_DynamicFieldName
    -> [BotConfigReplyToMedia_DynamicFieldName])
-> (BotConfigReplyToMedia_DynamicFieldName
    -> BotConfigReplyToMedia_DynamicFieldName
    -> BotConfigReplyToMedia_DynamicFieldName
    -> [BotConfigReplyToMedia_DynamicFieldName])
-> Enum BotConfigReplyToMedia_DynamicFieldName
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
succ :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
$cpred :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
pred :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
$ctoEnum :: Int -> BotConfigReplyToMedia_DynamicFieldName
toEnum :: Int -> BotConfigReplyToMedia_DynamicFieldName
$cfromEnum :: BotConfigReplyToMedia_DynamicFieldName -> Int
fromEnum :: BotConfigReplyToMedia_DynamicFieldName -> Int
$cenumFrom :: BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
enumFrom :: BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
$cenumFromThen :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
enumFromThen :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
$cenumFromTo :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
enumFromTo :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
$cenumFromThenTo :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
enumFromThenTo :: BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> BotConfigReplyToMedia_DynamicFieldName
-> [BotConfigReplyToMedia_DynamicFieldName]
Enum)

instance J.ToJSON BotConfigReplyToMedia_DynamicFieldName where
  toJSON :: BotConfigReplyToMedia_DynamicFieldName -> Value
toJSON BotConfigReplyToMedia_DynamicFieldName
BotConfigReplyToMedia_DynamicFieldName_MsgType = Text -> Value
J.String Text
"msgtype"
  toJSON BotConfigReplyToMedia_DynamicFieldName
BotConfigReplyToMedia_DynamicFieldName_Body = Text -> Value
J.String Text
"body"
  toJSON BotConfigReplyToMedia_DynamicFieldName
BotConfigReplyToMedia_DynamicFieldName_Url = Text -> Value
J.String Text
"url"

instance J.FromJSON BotConfigReplyToMedia_DynamicFieldName where
  parseJSON :: Value -> Parser BotConfigReplyToMedia_DynamicFieldName
parseJSON = Value -> Parser BotConfigReplyToMedia_DynamicFieldName
forall a.
(Typeable a, ToJSON a, Bounded a, Enum a) =>
Value -> Parser a
parseJsonEnum


data BotConfigReplyToMedia_DynamicExtractedValueName
  = BotConfigReplyToMedia_DynamicExtractedValueName_MediaId
  -- ^ @media_id@ — Contains media file identifier, can be used to form a direct HTTP link
  deriving stock ((forall x.
 BotConfigReplyToMedia_DynamicExtractedValueName
 -> Rep BotConfigReplyToMedia_DynamicExtractedValueName x)
-> (forall x.
    Rep BotConfigReplyToMedia_DynamicExtractedValueName x
    -> BotConfigReplyToMedia_DynamicExtractedValueName)
-> Generic BotConfigReplyToMedia_DynamicExtractedValueName
forall x.
Rep BotConfigReplyToMedia_DynamicExtractedValueName x
-> BotConfigReplyToMedia_DynamicExtractedValueName
forall x.
BotConfigReplyToMedia_DynamicExtractedValueName
-> Rep BotConfigReplyToMedia_DynamicExtractedValueName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
BotConfigReplyToMedia_DynamicExtractedValueName
-> Rep BotConfigReplyToMedia_DynamicExtractedValueName x
from :: forall x.
BotConfigReplyToMedia_DynamicExtractedValueName
-> Rep BotConfigReplyToMedia_DynamicExtractedValueName x
$cto :: forall x.
Rep BotConfigReplyToMedia_DynamicExtractedValueName x
-> BotConfigReplyToMedia_DynamicExtractedValueName
to :: forall x.
Rep BotConfigReplyToMedia_DynamicExtractedValueName x
-> BotConfigReplyToMedia_DynamicExtractedValueName
Generic, BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName -> Bool
(BotConfigReplyToMedia_DynamicExtractedValueName
 -> BotConfigReplyToMedia_DynamicExtractedValueName -> Bool)
-> (BotConfigReplyToMedia_DynamicExtractedValueName
    -> BotConfigReplyToMedia_DynamicExtractedValueName -> Bool)
-> Eq BotConfigReplyToMedia_DynamicExtractedValueName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName -> Bool
== :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName -> Bool
$c/= :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName -> Bool
/= :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName -> Bool
Eq, Int -> BotConfigReplyToMedia_DynamicExtractedValueName -> ShowS
[BotConfigReplyToMedia_DynamicExtractedValueName] -> ShowS
BotConfigReplyToMedia_DynamicExtractedValueName -> String
(Int -> BotConfigReplyToMedia_DynamicExtractedValueName -> ShowS)
-> (BotConfigReplyToMedia_DynamicExtractedValueName -> String)
-> ([BotConfigReplyToMedia_DynamicExtractedValueName] -> ShowS)
-> Show BotConfigReplyToMedia_DynamicExtractedValueName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BotConfigReplyToMedia_DynamicExtractedValueName -> ShowS
showsPrec :: Int -> BotConfigReplyToMedia_DynamicExtractedValueName -> ShowS
$cshow :: BotConfigReplyToMedia_DynamicExtractedValueName -> String
show :: BotConfigReplyToMedia_DynamicExtractedValueName -> String
$cshowList :: [BotConfigReplyToMedia_DynamicExtractedValueName] -> ShowS
showList :: [BotConfigReplyToMedia_DynamicExtractedValueName] -> ShowS
Show, BotConfigReplyToMedia_DynamicExtractedValueName
BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> Bounded BotConfigReplyToMedia_DynamicExtractedValueName
forall a. a -> a -> Bounded a
$cminBound :: BotConfigReplyToMedia_DynamicExtractedValueName
minBound :: BotConfigReplyToMedia_DynamicExtractedValueName
$cmaxBound :: BotConfigReplyToMedia_DynamicExtractedValueName
maxBound :: BotConfigReplyToMedia_DynamicExtractedValueName
Bounded, Int -> BotConfigReplyToMedia_DynamicExtractedValueName
BotConfigReplyToMedia_DynamicExtractedValueName -> Int
BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
(BotConfigReplyToMedia_DynamicExtractedValueName
 -> BotConfigReplyToMedia_DynamicExtractedValueName)
-> (BotConfigReplyToMedia_DynamicExtractedValueName
    -> BotConfigReplyToMedia_DynamicExtractedValueName)
-> (Int -> BotConfigReplyToMedia_DynamicExtractedValueName)
-> (BotConfigReplyToMedia_DynamicExtractedValueName -> Int)
-> (BotConfigReplyToMedia_DynamicExtractedValueName
    -> [BotConfigReplyToMedia_DynamicExtractedValueName])
-> (BotConfigReplyToMedia_DynamicExtractedValueName
    -> BotConfigReplyToMedia_DynamicExtractedValueName
    -> [BotConfigReplyToMedia_DynamicExtractedValueName])
-> (BotConfigReplyToMedia_DynamicExtractedValueName
    -> BotConfigReplyToMedia_DynamicExtractedValueName
    -> [BotConfigReplyToMedia_DynamicExtractedValueName])
-> (BotConfigReplyToMedia_DynamicExtractedValueName
    -> BotConfigReplyToMedia_DynamicExtractedValueName
    -> BotConfigReplyToMedia_DynamicExtractedValueName
    -> [BotConfigReplyToMedia_DynamicExtractedValueName])
-> Enum BotConfigReplyToMedia_DynamicExtractedValueName
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
succ :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
$cpred :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
pred :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
$ctoEnum :: Int -> BotConfigReplyToMedia_DynamicExtractedValueName
toEnum :: Int -> BotConfigReplyToMedia_DynamicExtractedValueName
$cfromEnum :: BotConfigReplyToMedia_DynamicExtractedValueName -> Int
fromEnum :: BotConfigReplyToMedia_DynamicExtractedValueName -> Int
$cenumFrom :: BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
enumFrom :: BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
$cenumFromThen :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
enumFromThen :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
$cenumFromTo :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
enumFromTo :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
$cenumFromThenTo :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
enumFromThenTo :: BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> BotConfigReplyToMedia_DynamicExtractedValueName
-> [BotConfigReplyToMedia_DynamicExtractedValueName]
Enum)

instance J.ToJSON BotConfigReplyToMedia_DynamicExtractedValueName where
  toJSON :: BotConfigReplyToMedia_DynamicExtractedValueName -> Value
toJSON BotConfigReplyToMedia_DynamicExtractedValueName
BotConfigReplyToMedia_DynamicExtractedValueName_MediaId = Text -> Value
J.String Text
"media_id"

instance J.FromJSON BotConfigReplyToMedia_DynamicExtractedValueName where
  parseJSON :: Value -> Parser BotConfigReplyToMedia_DynamicExtractedValueName
parseJSON = Value -> Parser BotConfigReplyToMedia_DynamicExtractedValueName
forall a.
(Typeable a, ToJSON a, Bounded a, Enum a) =>
Value -> Parser a
parseJsonEnum


-- | Derive @FromJSON@ based on @ToJSON@ for a Bounded Enum value.
parseJsonEnum  a. (Typeable a, J.ToJSON a, Bounded a, Enum a)  J.Value -> J.Parser a
parseJsonEnum :: forall a.
(Typeable a, ToJSON a, Bounded a, Enum a) =>
Value -> Parser a
parseJsonEnum = [a] -> Value -> Parser a
forall a. (Typeable a, ToJSON a) => [a] -> Value -> Parser a
parseJsonFromVariantsEqualityCheck [a
forall a. Bounded a => a
minBound .. a
forall a. Bounded a => a
maxBound  a]

-- | Derive @FromJSON@ based on @ToJSON@ using passed list of variants to apply equality check
--   against.
--
-- First variant in the list passing an equality check will be the parsed value.
parseJsonFromVariantsEqualityCheck
   a. (Typeable a, J.ToJSON a)
   [a]
   J.Value
   J.Parser a
parseJsonFromVariantsEqualityCheck :: forall a. (Typeable a, ToJSON a) => [a] -> Value -> Parser a
parseJsonFromVariantsEqualityCheck [a]
variants Value
jsonValue =
  case (a -> Bool) -> [a] -> Maybe a
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((Value
jsonValue Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
==) (Value -> Bool) -> (a -> Value) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Value
forall a. ToJSON a => a -> Value
J.toJSON) [a]
variants of
    Just a
x  a -> Parser a
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
    Maybe a
Nothing 
      String -> Parser a
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser a) -> String -> Parser a
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall a. Monoid a => [a] -> a
mconcat
        [ String
"Failed to parse ", (TypeRep -> String
forall a. Show a => a -> String
show (TypeRep -> String) -> (Proxy a -> TypeRep) -> Proxy a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy a -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep) (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a), String
" "
        , String
"(unexpected value: ", Value -> String
forall a. Show a => a -> String
show Value
jsonValue, String
")"
        ]