{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

-- | Data structures pertaining to Discord Embed
module Discord.Internal.Types.Embed where

import Data.Aeson
import Data.Time.Clock
import Data.Default (Default, def)
import qualified Data.Text as T
import qualified Data.ByteString as B

createEmbed :: CreateEmbed -> Embed
createEmbed :: CreateEmbed -> Embed
createEmbed CreateEmbed{[EmbedField]
Maybe CreateEmbedImage
Text
createEmbedFooterIcon :: CreateEmbed -> Maybe CreateEmbedImage
createEmbedFooterText :: CreateEmbed -> Text
createEmbedImage :: CreateEmbed -> Maybe CreateEmbedImage
createEmbedFields :: CreateEmbed -> [EmbedField]
createEmbedDescription :: CreateEmbed -> Text
createEmbedThumbnail :: CreateEmbed -> Maybe CreateEmbedImage
createEmbedUrl :: CreateEmbed -> Text
createEmbedTitle :: CreateEmbed -> Text
createEmbedAuthorIcon :: CreateEmbed -> Maybe CreateEmbedImage
createEmbedAuthorUrl :: CreateEmbed -> Text
createEmbedAuthorName :: CreateEmbed -> Text
createEmbedFooterIcon :: Maybe CreateEmbedImage
createEmbedFooterText :: Text
createEmbedImage :: Maybe CreateEmbedImage
createEmbedFields :: [EmbedField]
createEmbedDescription :: Text
createEmbedThumbnail :: Maybe CreateEmbedImage
createEmbedUrl :: Text
createEmbedTitle :: Text
createEmbedAuthorIcon :: Maybe CreateEmbedImage
createEmbedAuthorUrl :: Text
createEmbedAuthorName :: Text
..} =
  let
    emptyMaybe :: T.Text -> Maybe T.Text
    emptyMaybe :: Text -> Maybe Text
emptyMaybe Text
t = if Text -> Bool
T.null Text
t then Maybe Text
forall a. Maybe a
Nothing else Text -> Maybe Text
forall a. a -> Maybe a
Just Text
t

    embedImageToUrl :: T.Text -> CreateEmbedImage -> T.Text
    embedImageToUrl :: Text -> CreateEmbedImage -> Text
embedImageToUrl Text
place CreateEmbedImage
cei = case CreateEmbedImage
cei of
                            CreateEmbedImageUrl Text
t -> Text
t
                            CreateEmbedImageUpload ByteString
_ -> Text
"attachment://" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
place Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
".png"

    embedAuthor :: EmbedAuthor
embedAuthor = Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> EmbedAuthor
EmbedAuthor (Text -> Maybe Text
emptyMaybe Text
createEmbedAuthorName)
                              (Text -> Maybe Text
emptyMaybe Text
createEmbedAuthorUrl)
                              (Text -> CreateEmbedImage -> Text
embedImageToUrl Text
"author" (CreateEmbedImage -> Text) -> Maybe CreateEmbedImage -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe CreateEmbedImage
createEmbedAuthorIcon)
                              Maybe Text
forall a. Maybe a
Nothing
    embedImage :: EmbedImage
embedImage = Maybe Text
-> Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedImage
EmbedImage   (Text -> CreateEmbedImage -> Text
embedImageToUrl Text
"image" (CreateEmbedImage -> Text) -> Maybe CreateEmbedImage -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe CreateEmbedImage
createEmbedImage)
                              Maybe Text
forall a. Maybe a
Nothing Maybe Integer
forall a. Maybe a
Nothing Maybe Integer
forall a. Maybe a
Nothing
    embedThumbnail :: EmbedThumbnail
embedThumbnail = Maybe Text
-> Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedThumbnail
EmbedThumbnail (Text -> CreateEmbedImage -> Text
embedImageToUrl Text
"thumbnail" (CreateEmbedImage -> Text) -> Maybe CreateEmbedImage -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe CreateEmbedImage
createEmbedThumbnail)
                              Maybe Text
forall a. Maybe a
Nothing Maybe Integer
forall a. Maybe a
Nothing Maybe Integer
forall a. Maybe a
Nothing
    embedFooter :: EmbedFooter
embedFooter = Text -> Maybe Text -> Maybe Text -> EmbedFooter
EmbedFooter Text
createEmbedFooterText
                              (Text -> CreateEmbedImage -> Text
embedImageToUrl Text
"footer" (CreateEmbedImage -> Text) -> Maybe CreateEmbedImage -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe CreateEmbedImage
createEmbedFooterIcon)
                              Maybe Text
forall a. Maybe a
Nothing

  in Embed :: Maybe EmbedAuthor
-> Maybe Text
-> Maybe Text
-> Maybe EmbedThumbnail
-> Maybe Text
-> [EmbedField]
-> Maybe EmbedImage
-> Maybe EmbedFooter
-> Maybe Integer
-> Maybe UTCTime
-> Maybe Text
-> Maybe EmbedVideo
-> Maybe EmbedProvider
-> Embed
Embed { embedAuthor :: Maybe EmbedAuthor
embedAuthor      = EmbedAuthor -> Maybe EmbedAuthor
forall a. a -> Maybe a
Just EmbedAuthor
embedAuthor
           , embedTitle :: Maybe Text
embedTitle       = Text -> Maybe Text
emptyMaybe Text
createEmbedTitle
           , embedUrl :: Maybe Text
embedUrl         = Text -> Maybe Text
emptyMaybe Text
createEmbedUrl
           , embedThumbnail :: Maybe EmbedThumbnail
embedThumbnail   = EmbedThumbnail -> Maybe EmbedThumbnail
forall a. a -> Maybe a
Just EmbedThumbnail
embedThumbnail
           , embedDescription :: Maybe Text
embedDescription = Text -> Maybe Text
emptyMaybe Text
createEmbedDescription
           , embedFields :: [EmbedField]
embedFields      = [EmbedField]
createEmbedFields
           , embedImage :: Maybe EmbedImage
embedImage       = EmbedImage -> Maybe EmbedImage
forall a. a -> Maybe a
Just EmbedImage
embedImage
           , embedFooter :: Maybe EmbedFooter
embedFooter      = EmbedFooter -> Maybe EmbedFooter
forall a. a -> Maybe a
Just EmbedFooter
embedFooter
           , embedColor :: Maybe Integer
embedColor       = Maybe Integer
forall a. Maybe a
Nothing
           , embedTimestamp :: Maybe UTCTime
embedTimestamp   = Maybe UTCTime
forall a. Maybe a
Nothing

           -- can't set these
           , embedType :: Maybe Text
embedType        = Maybe Text
forall a. Maybe a
Nothing
           , embedVideo :: Maybe EmbedVideo
embedVideo       = Maybe EmbedVideo
forall a. Maybe a
Nothing
           , embedProvider :: Maybe EmbedProvider
embedProvider    = Maybe EmbedProvider
forall a. Maybe a
Nothing
           }

data CreateEmbed = CreateEmbed
  { CreateEmbed -> Text
createEmbedAuthorName  :: T.Text
  , CreateEmbed -> Text
createEmbedAuthorUrl   :: T.Text
  , CreateEmbed -> Maybe CreateEmbedImage
createEmbedAuthorIcon  :: Maybe CreateEmbedImage
  , CreateEmbed -> Text
createEmbedTitle       :: T.Text
  , CreateEmbed -> Text
createEmbedUrl         :: T.Text
  , CreateEmbed -> Maybe CreateEmbedImage
createEmbedThumbnail   :: Maybe CreateEmbedImage
  , CreateEmbed -> Text
createEmbedDescription :: T.Text
  , CreateEmbed -> [EmbedField]
createEmbedFields      :: [EmbedField]
  , CreateEmbed -> Maybe CreateEmbedImage
createEmbedImage       :: Maybe CreateEmbedImage
  , CreateEmbed -> Text
createEmbedFooterText  :: T.Text
  , CreateEmbed -> Maybe CreateEmbedImage
createEmbedFooterIcon  :: Maybe CreateEmbedImage
--, createEmbedColor       :: Maybe T.Text
--, createEmbedTimestamp   :: Maybe UTCTime
  } deriving (Int -> CreateEmbed -> ShowS
[CreateEmbed] -> ShowS
CreateEmbed -> String
(Int -> CreateEmbed -> ShowS)
-> (CreateEmbed -> String)
-> ([CreateEmbed] -> ShowS)
-> Show CreateEmbed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateEmbed] -> ShowS
$cshowList :: [CreateEmbed] -> ShowS
show :: CreateEmbed -> String
$cshow :: CreateEmbed -> String
showsPrec :: Int -> CreateEmbed -> ShowS
$cshowsPrec :: Int -> CreateEmbed -> ShowS
Show, CreateEmbed -> CreateEmbed -> Bool
(CreateEmbed -> CreateEmbed -> Bool)
-> (CreateEmbed -> CreateEmbed -> Bool) -> Eq CreateEmbed
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateEmbed -> CreateEmbed -> Bool
$c/= :: CreateEmbed -> CreateEmbed -> Bool
== :: CreateEmbed -> CreateEmbed -> Bool
$c== :: CreateEmbed -> CreateEmbed -> Bool
Eq, Eq CreateEmbed
Eq CreateEmbed
-> (CreateEmbed -> CreateEmbed -> Ordering)
-> (CreateEmbed -> CreateEmbed -> Bool)
-> (CreateEmbed -> CreateEmbed -> Bool)
-> (CreateEmbed -> CreateEmbed -> Bool)
-> (CreateEmbed -> CreateEmbed -> Bool)
-> (CreateEmbed -> CreateEmbed -> CreateEmbed)
-> (CreateEmbed -> CreateEmbed -> CreateEmbed)
-> Ord CreateEmbed
CreateEmbed -> CreateEmbed -> Bool
CreateEmbed -> CreateEmbed -> Ordering
CreateEmbed -> CreateEmbed -> CreateEmbed
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CreateEmbed -> CreateEmbed -> CreateEmbed
$cmin :: CreateEmbed -> CreateEmbed -> CreateEmbed
max :: CreateEmbed -> CreateEmbed -> CreateEmbed
$cmax :: CreateEmbed -> CreateEmbed -> CreateEmbed
>= :: CreateEmbed -> CreateEmbed -> Bool
$c>= :: CreateEmbed -> CreateEmbed -> Bool
> :: CreateEmbed -> CreateEmbed -> Bool
$c> :: CreateEmbed -> CreateEmbed -> Bool
<= :: CreateEmbed -> CreateEmbed -> Bool
$c<= :: CreateEmbed -> CreateEmbed -> Bool
< :: CreateEmbed -> CreateEmbed -> Bool
$c< :: CreateEmbed -> CreateEmbed -> Bool
compare :: CreateEmbed -> CreateEmbed -> Ordering
$ccompare :: CreateEmbed -> CreateEmbed -> Ordering
$cp1Ord :: Eq CreateEmbed
Ord)

data CreateEmbedImage = CreateEmbedImageUrl T.Text
                      | CreateEmbedImageUpload B.ByteString
  deriving (Int -> CreateEmbedImage -> ShowS
[CreateEmbedImage] -> ShowS
CreateEmbedImage -> String
(Int -> CreateEmbedImage -> ShowS)
-> (CreateEmbedImage -> String)
-> ([CreateEmbedImage] -> ShowS)
-> Show CreateEmbedImage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateEmbedImage] -> ShowS
$cshowList :: [CreateEmbedImage] -> ShowS
show :: CreateEmbedImage -> String
$cshow :: CreateEmbedImage -> String
showsPrec :: Int -> CreateEmbedImage -> ShowS
$cshowsPrec :: Int -> CreateEmbedImage -> ShowS
Show, CreateEmbedImage -> CreateEmbedImage -> Bool
(CreateEmbedImage -> CreateEmbedImage -> Bool)
-> (CreateEmbedImage -> CreateEmbedImage -> Bool)
-> Eq CreateEmbedImage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateEmbedImage -> CreateEmbedImage -> Bool
$c/= :: CreateEmbedImage -> CreateEmbedImage -> Bool
== :: CreateEmbedImage -> CreateEmbedImage -> Bool
$c== :: CreateEmbedImage -> CreateEmbedImage -> Bool
Eq, Eq CreateEmbedImage
Eq CreateEmbedImage
-> (CreateEmbedImage -> CreateEmbedImage -> Ordering)
-> (CreateEmbedImage -> CreateEmbedImage -> Bool)
-> (CreateEmbedImage -> CreateEmbedImage -> Bool)
-> (CreateEmbedImage -> CreateEmbedImage -> Bool)
-> (CreateEmbedImage -> CreateEmbedImage -> Bool)
-> (CreateEmbedImage -> CreateEmbedImage -> CreateEmbedImage)
-> (CreateEmbedImage -> CreateEmbedImage -> CreateEmbedImage)
-> Ord CreateEmbedImage
CreateEmbedImage -> CreateEmbedImage -> Bool
CreateEmbedImage -> CreateEmbedImage -> Ordering
CreateEmbedImage -> CreateEmbedImage -> CreateEmbedImage
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CreateEmbedImage -> CreateEmbedImage -> CreateEmbedImage
$cmin :: CreateEmbedImage -> CreateEmbedImage -> CreateEmbedImage
max :: CreateEmbedImage -> CreateEmbedImage -> CreateEmbedImage
$cmax :: CreateEmbedImage -> CreateEmbedImage -> CreateEmbedImage
>= :: CreateEmbedImage -> CreateEmbedImage -> Bool
$c>= :: CreateEmbedImage -> CreateEmbedImage -> Bool
> :: CreateEmbedImage -> CreateEmbedImage -> Bool
$c> :: CreateEmbedImage -> CreateEmbedImage -> Bool
<= :: CreateEmbedImage -> CreateEmbedImage -> Bool
$c<= :: CreateEmbedImage -> CreateEmbedImage -> Bool
< :: CreateEmbedImage -> CreateEmbedImage -> Bool
$c< :: CreateEmbedImage -> CreateEmbedImage -> Bool
compare :: CreateEmbedImage -> CreateEmbedImage -> Ordering
$ccompare :: CreateEmbedImage -> CreateEmbedImage -> Ordering
$cp1Ord :: Eq CreateEmbedImage
Ord)

instance Default CreateEmbed where
 def :: CreateEmbed
def = Text
-> Text
-> Maybe CreateEmbedImage
-> Text
-> Text
-> Maybe CreateEmbedImage
-> Text
-> [EmbedField]
-> Maybe CreateEmbedImage
-> Text
-> Maybe CreateEmbedImage
-> CreateEmbed
CreateEmbed Text
"" Text
"" Maybe CreateEmbedImage
forall a. Maybe a
Nothing Text
"" Text
"" Maybe CreateEmbedImage
forall a. Maybe a
Nothing Text
"" [] Maybe CreateEmbedImage
forall a. Maybe a
Nothing Text
"" Maybe CreateEmbedImage
forall a. Maybe a
Nothing -- Nothing Nothing

-- | An embed attached to a message.
data Embed = Embed
  { Embed -> Maybe EmbedAuthor
embedAuthor      :: Maybe EmbedAuthor
  , Embed -> Maybe Text
embedTitle       :: Maybe T.Text     -- ^ Title of the embed
  , Embed -> Maybe Text
embedUrl         :: Maybe T.Text     -- ^ URL of embed
  , Embed -> Maybe EmbedThumbnail
embedThumbnail   :: Maybe EmbedThumbnail -- ^ Thumbnail in top-right
  , Embed -> Maybe Text
embedDescription :: Maybe T.Text     -- ^ Description of embed
  , Embed -> [EmbedField]
embedFields      :: [EmbedField]     -- ^ Fields of the embed
  , Embed -> Maybe EmbedImage
embedImage       :: Maybe EmbedImage
  , Embed -> Maybe EmbedFooter
embedFooter      :: Maybe EmbedFooter

  , Embed -> Maybe Integer
embedColor       :: Maybe Integer    -- ^ The embed color
  , Embed -> Maybe UTCTime
embedTimestamp   :: Maybe UTCTime    -- ^ The time of the embed content
  , Embed -> Maybe Text
embedType        :: Maybe T.Text     -- ^ Type of embed (Always "rich" for users)
  , Embed -> Maybe EmbedVideo
embedVideo       :: Maybe EmbedVideo -- ^ Only present for "video" types
  , Embed -> Maybe EmbedProvider
embedProvider    :: Maybe EmbedProvider -- ^ Only present for "video" types
  } deriving (Int -> Embed -> ShowS
[Embed] -> ShowS
Embed -> String
(Int -> Embed -> ShowS)
-> (Embed -> String) -> ([Embed] -> ShowS) -> Show Embed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Embed] -> ShowS
$cshowList :: [Embed] -> ShowS
show :: Embed -> String
$cshow :: Embed -> String
showsPrec :: Int -> Embed -> ShowS
$cshowsPrec :: Int -> Embed -> ShowS
Show, Embed -> Embed -> Bool
(Embed -> Embed -> Bool) -> (Embed -> Embed -> Bool) -> Eq Embed
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Embed -> Embed -> Bool
$c/= :: Embed -> Embed -> Bool
== :: Embed -> Embed -> Bool
$c== :: Embed -> Embed -> Bool
Eq, Eq Embed
Eq Embed
-> (Embed -> Embed -> Ordering)
-> (Embed -> Embed -> Bool)
-> (Embed -> Embed -> Bool)
-> (Embed -> Embed -> Bool)
-> (Embed -> Embed -> Bool)
-> (Embed -> Embed -> Embed)
-> (Embed -> Embed -> Embed)
-> Ord Embed
Embed -> Embed -> Bool
Embed -> Embed -> Ordering
Embed -> Embed -> Embed
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Embed -> Embed -> Embed
$cmin :: Embed -> Embed -> Embed
max :: Embed -> Embed -> Embed
$cmax :: Embed -> Embed -> Embed
>= :: Embed -> Embed -> Bool
$c>= :: Embed -> Embed -> Bool
> :: Embed -> Embed -> Bool
$c> :: Embed -> Embed -> Bool
<= :: Embed -> Embed -> Bool
$c<= :: Embed -> Embed -> Bool
< :: Embed -> Embed -> Bool
$c< :: Embed -> Embed -> Bool
compare :: Embed -> Embed -> Ordering
$ccompare :: Embed -> Embed -> Ordering
$cp1Ord :: Eq Embed
Ord)

-- TODO
instance ToJSON Embed where
  toJSON :: Embed -> Value
toJSON Embed{[EmbedField]
Maybe Integer
Maybe Text
Maybe UTCTime
Maybe EmbedFooter
Maybe EmbedAuthor
Maybe EmbedProvider
Maybe EmbedImage
Maybe EmbedVideo
Maybe EmbedThumbnail
embedProvider :: Maybe EmbedProvider
embedVideo :: Maybe EmbedVideo
embedType :: Maybe Text
embedTimestamp :: Maybe UTCTime
embedColor :: Maybe Integer
embedFooter :: Maybe EmbedFooter
embedImage :: Maybe EmbedImage
embedFields :: [EmbedField]
embedDescription :: Maybe Text
embedThumbnail :: Maybe EmbedThumbnail
embedUrl :: Maybe Text
embedTitle :: Maybe Text
embedAuthor :: Maybe EmbedAuthor
embedProvider :: Embed -> Maybe EmbedProvider
embedVideo :: Embed -> Maybe EmbedVideo
embedType :: Embed -> Maybe Text
embedTimestamp :: Embed -> Maybe UTCTime
embedColor :: Embed -> Maybe Integer
embedFooter :: Embed -> Maybe EmbedFooter
embedImage :: Embed -> Maybe EmbedImage
embedFields :: Embed -> [EmbedField]
embedDescription :: Embed -> Maybe Text
embedThumbnail :: Embed -> Maybe EmbedThumbnail
embedUrl :: Embed -> Maybe Text
embedTitle :: Embed -> Maybe Text
embedAuthor :: Embed -> Maybe EmbedAuthor
..} = [Pair] -> Value
object
   [ Text
"author"      Text -> Maybe EmbedAuthor -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe EmbedAuthor
embedAuthor
   , Text
"title"       Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
embedTitle
   , Text
"url"         Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
embedUrl
   , Text
"description" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
embedDescription
   , Text
"thumbnail"   Text -> Maybe EmbedThumbnail -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe EmbedThumbnail
embedThumbnail
   , Text
"fields"      Text -> [EmbedField] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= [EmbedField]
embedFields
   , Text
"image"       Text -> Maybe EmbedImage -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe EmbedImage
embedImage
   , Text
"footer"      Text -> Maybe EmbedFooter -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe EmbedFooter
embedFooter
   , Text
"color"       Text -> Maybe Integer -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Integer
embedColor
   , Text
"timestamp"   Text -> Maybe UTCTime -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe UTCTime
embedTimestamp
   , Text
"type"        Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
embedType
   , Text
"video"       Text -> Maybe EmbedVideo -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe EmbedVideo
embedVideo
   , Text
"provider"    Text -> Maybe EmbedProvider -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe EmbedProvider
embedProvider
    ]

instance FromJSON Embed where
  parseJSON :: Value -> Parser Embed
parseJSON = String -> (Object -> Parser Embed) -> Value -> Parser Embed
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"embed" ((Object -> Parser Embed) -> Value -> Parser Embed)
-> (Object -> Parser Embed) -> Value -> Parser Embed
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe EmbedAuthor
-> Maybe Text
-> Maybe Text
-> Maybe EmbedThumbnail
-> Maybe Text
-> [EmbedField]
-> Maybe EmbedImage
-> Maybe EmbedFooter
-> Maybe Integer
-> Maybe UTCTime
-> Maybe Text
-> Maybe EmbedVideo
-> Maybe EmbedProvider
-> Embed
Embed (Maybe EmbedAuthor
 -> Maybe Text
 -> Maybe Text
 -> Maybe EmbedThumbnail
 -> Maybe Text
 -> [EmbedField]
 -> Maybe EmbedImage
 -> Maybe EmbedFooter
 -> Maybe Integer
 -> Maybe UTCTime
 -> Maybe Text
 -> Maybe EmbedVideo
 -> Maybe EmbedProvider
 -> Embed)
-> Parser (Maybe EmbedAuthor)
-> Parser
     (Maybe Text
      -> Maybe Text
      -> Maybe EmbedThumbnail
      -> Maybe Text
      -> [EmbedField]
      -> Maybe EmbedImage
      -> Maybe EmbedFooter
      -> Maybe Integer
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe EmbedVideo
      -> Maybe EmbedProvider
      -> Embed)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe EmbedAuthor)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"author"
          Parser
  (Maybe Text
   -> Maybe Text
   -> Maybe EmbedThumbnail
   -> Maybe Text
   -> [EmbedField]
   -> Maybe EmbedImage
   -> Maybe EmbedFooter
   -> Maybe Integer
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe EmbedVideo
   -> Maybe EmbedProvider
   -> Embed)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> Maybe EmbedThumbnail
      -> Maybe Text
      -> [EmbedField]
      -> Maybe EmbedImage
      -> Maybe EmbedFooter
      -> Maybe Integer
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe EmbedVideo
      -> Maybe EmbedProvider
      -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"title"
          Parser
  (Maybe Text
   -> Maybe EmbedThumbnail
   -> Maybe Text
   -> [EmbedField]
   -> Maybe EmbedImage
   -> Maybe EmbedFooter
   -> Maybe Integer
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe EmbedVideo
   -> Maybe EmbedProvider
   -> Embed)
-> Parser (Maybe Text)
-> Parser
     (Maybe EmbedThumbnail
      -> Maybe Text
      -> [EmbedField]
      -> Maybe EmbedImage
      -> Maybe EmbedFooter
      -> Maybe Integer
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe EmbedVideo
      -> Maybe EmbedProvider
      -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"url"
          Parser
  (Maybe EmbedThumbnail
   -> Maybe Text
   -> [EmbedField]
   -> Maybe EmbedImage
   -> Maybe EmbedFooter
   -> Maybe Integer
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe EmbedVideo
   -> Maybe EmbedProvider
   -> Embed)
-> Parser (Maybe EmbedThumbnail)
-> Parser
     (Maybe Text
      -> [EmbedField]
      -> Maybe EmbedImage
      -> Maybe EmbedFooter
      -> Maybe Integer
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe EmbedVideo
      -> Maybe EmbedProvider
      -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe EmbedThumbnail)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"thumbnail"
          Parser
  (Maybe Text
   -> [EmbedField]
   -> Maybe EmbedImage
   -> Maybe EmbedFooter
   -> Maybe Integer
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe EmbedVideo
   -> Maybe EmbedProvider
   -> Embed)
-> Parser (Maybe Text)
-> Parser
     ([EmbedField]
      -> Maybe EmbedImage
      -> Maybe EmbedFooter
      -> Maybe Integer
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe EmbedVideo
      -> Maybe EmbedProvider
      -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"description"
          Parser
  ([EmbedField]
   -> Maybe EmbedImage
   -> Maybe EmbedFooter
   -> Maybe Integer
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe EmbedVideo
   -> Maybe EmbedProvider
   -> Embed)
-> Parser [EmbedField]
-> Parser
     (Maybe EmbedImage
      -> Maybe EmbedFooter
      -> Maybe Integer
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe EmbedVideo
      -> Maybe EmbedProvider
      -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [EmbedField])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"fields" Parser (Maybe [EmbedField]) -> [EmbedField] -> Parser [EmbedField]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
          Parser
  (Maybe EmbedImage
   -> Maybe EmbedFooter
   -> Maybe Integer
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe EmbedVideo
   -> Maybe EmbedProvider
   -> Embed)
-> Parser (Maybe EmbedImage)
-> Parser
     (Maybe EmbedFooter
      -> Maybe Integer
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe EmbedVideo
      -> Maybe EmbedProvider
      -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe EmbedImage)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"image"
          Parser
  (Maybe EmbedFooter
   -> Maybe Integer
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe EmbedVideo
   -> Maybe EmbedProvider
   -> Embed)
-> Parser (Maybe EmbedFooter)
-> Parser
     (Maybe Integer
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe EmbedVideo
      -> Maybe EmbedProvider
      -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe EmbedFooter)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"footer"
          Parser
  (Maybe Integer
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe EmbedVideo
   -> Maybe EmbedProvider
   -> Embed)
-> Parser (Maybe Integer)
-> Parser
     (Maybe UTCTime
      -> Maybe Text -> Maybe EmbedVideo -> Maybe EmbedProvider -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"color"
          Parser
  (Maybe UTCTime
   -> Maybe Text -> Maybe EmbedVideo -> Maybe EmbedProvider -> Embed)
-> Parser (Maybe UTCTime)
-> Parser
     (Maybe Text -> Maybe EmbedVideo -> Maybe EmbedProvider -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"timestamp"
          Parser
  (Maybe Text -> Maybe EmbedVideo -> Maybe EmbedProvider -> Embed)
-> Parser (Maybe Text)
-> Parser (Maybe EmbedVideo -> Maybe EmbedProvider -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"type"
          Parser (Maybe EmbedVideo -> Maybe EmbedProvider -> Embed)
-> Parser (Maybe EmbedVideo)
-> Parser (Maybe EmbedProvider -> Embed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe EmbedVideo)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"video"
          Parser (Maybe EmbedProvider -> Embed)
-> Parser (Maybe EmbedProvider) -> Parser Embed
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe EmbedProvider)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"provider"


data EmbedThumbnail = EmbedThumbnail
  { EmbedThumbnail -> Maybe Text
embedThumbnailUrl :: Maybe T.Text
  , EmbedThumbnail -> Maybe Text
embedThumbnailProxyUrl :: Maybe T.Text
  , EmbedThumbnail -> Maybe Integer
embedThumbnailHeight :: Maybe Integer
  , EmbedThumbnail -> Maybe Integer
embedThumbnailWidth :: Maybe Integer
  } deriving (Int -> EmbedThumbnail -> ShowS
[EmbedThumbnail] -> ShowS
EmbedThumbnail -> String
(Int -> EmbedThumbnail -> ShowS)
-> (EmbedThumbnail -> String)
-> ([EmbedThumbnail] -> ShowS)
-> Show EmbedThumbnail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmbedThumbnail] -> ShowS
$cshowList :: [EmbedThumbnail] -> ShowS
show :: EmbedThumbnail -> String
$cshow :: EmbedThumbnail -> String
showsPrec :: Int -> EmbedThumbnail -> ShowS
$cshowsPrec :: Int -> EmbedThumbnail -> ShowS
Show, EmbedThumbnail -> EmbedThumbnail -> Bool
(EmbedThumbnail -> EmbedThumbnail -> Bool)
-> (EmbedThumbnail -> EmbedThumbnail -> Bool) -> Eq EmbedThumbnail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EmbedThumbnail -> EmbedThumbnail -> Bool
$c/= :: EmbedThumbnail -> EmbedThumbnail -> Bool
== :: EmbedThumbnail -> EmbedThumbnail -> Bool
$c== :: EmbedThumbnail -> EmbedThumbnail -> Bool
Eq, Eq EmbedThumbnail
Eq EmbedThumbnail
-> (EmbedThumbnail -> EmbedThumbnail -> Ordering)
-> (EmbedThumbnail -> EmbedThumbnail -> Bool)
-> (EmbedThumbnail -> EmbedThumbnail -> Bool)
-> (EmbedThumbnail -> EmbedThumbnail -> Bool)
-> (EmbedThumbnail -> EmbedThumbnail -> Bool)
-> (EmbedThumbnail -> EmbedThumbnail -> EmbedThumbnail)
-> (EmbedThumbnail -> EmbedThumbnail -> EmbedThumbnail)
-> Ord EmbedThumbnail
EmbedThumbnail -> EmbedThumbnail -> Bool
EmbedThumbnail -> EmbedThumbnail -> Ordering
EmbedThumbnail -> EmbedThumbnail -> EmbedThumbnail
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EmbedThumbnail -> EmbedThumbnail -> EmbedThumbnail
$cmin :: EmbedThumbnail -> EmbedThumbnail -> EmbedThumbnail
max :: EmbedThumbnail -> EmbedThumbnail -> EmbedThumbnail
$cmax :: EmbedThumbnail -> EmbedThumbnail -> EmbedThumbnail
>= :: EmbedThumbnail -> EmbedThumbnail -> Bool
$c>= :: EmbedThumbnail -> EmbedThumbnail -> Bool
> :: EmbedThumbnail -> EmbedThumbnail -> Bool
$c> :: EmbedThumbnail -> EmbedThumbnail -> Bool
<= :: EmbedThumbnail -> EmbedThumbnail -> Bool
$c<= :: EmbedThumbnail -> EmbedThumbnail -> Bool
< :: EmbedThumbnail -> EmbedThumbnail -> Bool
$c< :: EmbedThumbnail -> EmbedThumbnail -> Bool
compare :: EmbedThumbnail -> EmbedThumbnail -> Ordering
$ccompare :: EmbedThumbnail -> EmbedThumbnail -> Ordering
$cp1Ord :: Eq EmbedThumbnail
Ord)

instance ToJSON EmbedThumbnail where
  toJSON :: EmbedThumbnail -> Value
toJSON (EmbedThumbnail Maybe Text
a Maybe Text
b Maybe Integer
c Maybe Integer
d) = [Pair] -> Value
object
    [ Text
"url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
a
    , Text
"proxy_url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
b
    , Text
"height" Text -> Maybe Integer -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Integer
c
    , Text
"width" Text -> Maybe Integer -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Integer
d
    ]

instance FromJSON EmbedThumbnail where
  parseJSON :: Value -> Parser EmbedThumbnail
parseJSON = String
-> (Object -> Parser EmbedThumbnail)
-> Value
-> Parser EmbedThumbnail
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"thumbnail" ((Object -> Parser EmbedThumbnail)
 -> Value -> Parser EmbedThumbnail)
-> (Object -> Parser EmbedThumbnail)
-> Value
-> Parser EmbedThumbnail
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe Text
-> Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedThumbnail
EmbedThumbnail (Maybe Text
 -> Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedThumbnail)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedThumbnail)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"url"
                   Parser
  (Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedThumbnail)
-> Parser (Maybe Text)
-> Parser (Maybe Integer -> Maybe Integer -> EmbedThumbnail)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"proxy_url"
                   Parser (Maybe Integer -> Maybe Integer -> EmbedThumbnail)
-> Parser (Maybe Integer)
-> Parser (Maybe Integer -> EmbedThumbnail)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"height"
                   Parser (Maybe Integer -> EmbedThumbnail)
-> Parser (Maybe Integer) -> Parser EmbedThumbnail
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"width"

data EmbedVideo = EmbedVideo
  { EmbedVideo -> Maybe Text
embedVideoUrl :: Maybe T.Text
  , EmbedVideo -> Maybe Integer
embedVideoHeight :: Maybe Integer
  , EmbedVideo -> Maybe Integer
embedVideoWidth :: Maybe Integer
  } deriving (Int -> EmbedVideo -> ShowS
[EmbedVideo] -> ShowS
EmbedVideo -> String
(Int -> EmbedVideo -> ShowS)
-> (EmbedVideo -> String)
-> ([EmbedVideo] -> ShowS)
-> Show EmbedVideo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmbedVideo] -> ShowS
$cshowList :: [EmbedVideo] -> ShowS
show :: EmbedVideo -> String
$cshow :: EmbedVideo -> String
showsPrec :: Int -> EmbedVideo -> ShowS
$cshowsPrec :: Int -> EmbedVideo -> ShowS
Show, EmbedVideo -> EmbedVideo -> Bool
(EmbedVideo -> EmbedVideo -> Bool)
-> (EmbedVideo -> EmbedVideo -> Bool) -> Eq EmbedVideo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EmbedVideo -> EmbedVideo -> Bool
$c/= :: EmbedVideo -> EmbedVideo -> Bool
== :: EmbedVideo -> EmbedVideo -> Bool
$c== :: EmbedVideo -> EmbedVideo -> Bool
Eq, Eq EmbedVideo
Eq EmbedVideo
-> (EmbedVideo -> EmbedVideo -> Ordering)
-> (EmbedVideo -> EmbedVideo -> Bool)
-> (EmbedVideo -> EmbedVideo -> Bool)
-> (EmbedVideo -> EmbedVideo -> Bool)
-> (EmbedVideo -> EmbedVideo -> Bool)
-> (EmbedVideo -> EmbedVideo -> EmbedVideo)
-> (EmbedVideo -> EmbedVideo -> EmbedVideo)
-> Ord EmbedVideo
EmbedVideo -> EmbedVideo -> Bool
EmbedVideo -> EmbedVideo -> Ordering
EmbedVideo -> EmbedVideo -> EmbedVideo
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EmbedVideo -> EmbedVideo -> EmbedVideo
$cmin :: EmbedVideo -> EmbedVideo -> EmbedVideo
max :: EmbedVideo -> EmbedVideo -> EmbedVideo
$cmax :: EmbedVideo -> EmbedVideo -> EmbedVideo
>= :: EmbedVideo -> EmbedVideo -> Bool
$c>= :: EmbedVideo -> EmbedVideo -> Bool
> :: EmbedVideo -> EmbedVideo -> Bool
$c> :: EmbedVideo -> EmbedVideo -> Bool
<= :: EmbedVideo -> EmbedVideo -> Bool
$c<= :: EmbedVideo -> EmbedVideo -> Bool
< :: EmbedVideo -> EmbedVideo -> Bool
$c< :: EmbedVideo -> EmbedVideo -> Bool
compare :: EmbedVideo -> EmbedVideo -> Ordering
$ccompare :: EmbedVideo -> EmbedVideo -> Ordering
$cp1Ord :: Eq EmbedVideo
Ord)

instance ToJSON EmbedVideo where
  toJSON :: EmbedVideo -> Value
toJSON (EmbedVideo Maybe Text
a Maybe Integer
b Maybe Integer
c) = [Pair] -> Value
object
    [ Text
"url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
a
    , Text
"height" Text -> Maybe Integer -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Integer
b
    , Text
"width" Text -> Maybe Integer -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Integer
c
    ]

instance FromJSON EmbedVideo where
  parseJSON :: Value -> Parser EmbedVideo
parseJSON = String
-> (Object -> Parser EmbedVideo) -> Value -> Parser EmbedVideo
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"video" ((Object -> Parser EmbedVideo) -> Value -> Parser EmbedVideo)
-> (Object -> Parser EmbedVideo) -> Value -> Parser EmbedVideo
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedVideo
EmbedVideo (Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedVideo)
-> Parser (Maybe Text)
-> Parser (Maybe Integer -> Maybe Integer -> EmbedVideo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"url"
               Parser (Maybe Integer -> Maybe Integer -> EmbedVideo)
-> Parser (Maybe Integer) -> Parser (Maybe Integer -> EmbedVideo)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"height"
               Parser (Maybe Integer -> EmbedVideo)
-> Parser (Maybe Integer) -> Parser EmbedVideo
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"width"

data EmbedImage = EmbedImage
  { EmbedImage -> Maybe Text
embedImageUrl :: Maybe T.Text
  , EmbedImage -> Maybe Text
embedImageProxyUrl :: Maybe T.Text
  , EmbedImage -> Maybe Integer
embedImageHeight :: Maybe Integer
  , EmbedImage -> Maybe Integer
embedImageWidth :: Maybe Integer
  } deriving (Int -> EmbedImage -> ShowS
[EmbedImage] -> ShowS
EmbedImage -> String
(Int -> EmbedImage -> ShowS)
-> (EmbedImage -> String)
-> ([EmbedImage] -> ShowS)
-> Show EmbedImage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmbedImage] -> ShowS
$cshowList :: [EmbedImage] -> ShowS
show :: EmbedImage -> String
$cshow :: EmbedImage -> String
showsPrec :: Int -> EmbedImage -> ShowS
$cshowsPrec :: Int -> EmbedImage -> ShowS
Show, EmbedImage -> EmbedImage -> Bool
(EmbedImage -> EmbedImage -> Bool)
-> (EmbedImage -> EmbedImage -> Bool) -> Eq EmbedImage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EmbedImage -> EmbedImage -> Bool
$c/= :: EmbedImage -> EmbedImage -> Bool
== :: EmbedImage -> EmbedImage -> Bool
$c== :: EmbedImage -> EmbedImage -> Bool
Eq, Eq EmbedImage
Eq EmbedImage
-> (EmbedImage -> EmbedImage -> Ordering)
-> (EmbedImage -> EmbedImage -> Bool)
-> (EmbedImage -> EmbedImage -> Bool)
-> (EmbedImage -> EmbedImage -> Bool)
-> (EmbedImage -> EmbedImage -> Bool)
-> (EmbedImage -> EmbedImage -> EmbedImage)
-> (EmbedImage -> EmbedImage -> EmbedImage)
-> Ord EmbedImage
EmbedImage -> EmbedImage -> Bool
EmbedImage -> EmbedImage -> Ordering
EmbedImage -> EmbedImage -> EmbedImage
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EmbedImage -> EmbedImage -> EmbedImage
$cmin :: EmbedImage -> EmbedImage -> EmbedImage
max :: EmbedImage -> EmbedImage -> EmbedImage
$cmax :: EmbedImage -> EmbedImage -> EmbedImage
>= :: EmbedImage -> EmbedImage -> Bool
$c>= :: EmbedImage -> EmbedImage -> Bool
> :: EmbedImage -> EmbedImage -> Bool
$c> :: EmbedImage -> EmbedImage -> Bool
<= :: EmbedImage -> EmbedImage -> Bool
$c<= :: EmbedImage -> EmbedImage -> Bool
< :: EmbedImage -> EmbedImage -> Bool
$c< :: EmbedImage -> EmbedImage -> Bool
compare :: EmbedImage -> EmbedImage -> Ordering
$ccompare :: EmbedImage -> EmbedImage -> Ordering
$cp1Ord :: Eq EmbedImage
Ord)

instance ToJSON EmbedImage where
  toJSON :: EmbedImage -> Value
toJSON (EmbedImage Maybe Text
a Maybe Text
b Maybe Integer
c Maybe Integer
d) = [Pair] -> Value
object
    [ Text
"url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
a
    , Text
"proxy_url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
b
    , Text
"height" Text -> Maybe Integer -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Integer
c
    , Text
"width" Text -> Maybe Integer -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Integer
d
    ]

instance FromJSON EmbedImage where
  parseJSON :: Value -> Parser EmbedImage
parseJSON = String
-> (Object -> Parser EmbedImage) -> Value -> Parser EmbedImage
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"image" ((Object -> Parser EmbedImage) -> Value -> Parser EmbedImage)
-> (Object -> Parser EmbedImage) -> Value -> Parser EmbedImage
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe Text
-> Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedImage
EmbedImage (Maybe Text
 -> Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedImage)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedImage)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"url"
               Parser (Maybe Text -> Maybe Integer -> Maybe Integer -> EmbedImage)
-> Parser (Maybe Text)
-> Parser (Maybe Integer -> Maybe Integer -> EmbedImage)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"proxy_url"
               Parser (Maybe Integer -> Maybe Integer -> EmbedImage)
-> Parser (Maybe Integer) -> Parser (Maybe Integer -> EmbedImage)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"height"
               Parser (Maybe Integer -> EmbedImage)
-> Parser (Maybe Integer) -> Parser EmbedImage
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"width"

data EmbedProvider = EmbedProvider
  { EmbedProvider -> Maybe Text
embedProviderName :: Maybe T.Text
  , EmbedProvider -> Maybe Text
embedProviderUrl :: Maybe T.Text
  } deriving (Int -> EmbedProvider -> ShowS
[EmbedProvider] -> ShowS
EmbedProvider -> String
(Int -> EmbedProvider -> ShowS)
-> (EmbedProvider -> String)
-> ([EmbedProvider] -> ShowS)
-> Show EmbedProvider
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmbedProvider] -> ShowS
$cshowList :: [EmbedProvider] -> ShowS
show :: EmbedProvider -> String
$cshow :: EmbedProvider -> String
showsPrec :: Int -> EmbedProvider -> ShowS
$cshowsPrec :: Int -> EmbedProvider -> ShowS
Show, EmbedProvider -> EmbedProvider -> Bool
(EmbedProvider -> EmbedProvider -> Bool)
-> (EmbedProvider -> EmbedProvider -> Bool) -> Eq EmbedProvider
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EmbedProvider -> EmbedProvider -> Bool
$c/= :: EmbedProvider -> EmbedProvider -> Bool
== :: EmbedProvider -> EmbedProvider -> Bool
$c== :: EmbedProvider -> EmbedProvider -> Bool
Eq, Eq EmbedProvider
Eq EmbedProvider
-> (EmbedProvider -> EmbedProvider -> Ordering)
-> (EmbedProvider -> EmbedProvider -> Bool)
-> (EmbedProvider -> EmbedProvider -> Bool)
-> (EmbedProvider -> EmbedProvider -> Bool)
-> (EmbedProvider -> EmbedProvider -> Bool)
-> (EmbedProvider -> EmbedProvider -> EmbedProvider)
-> (EmbedProvider -> EmbedProvider -> EmbedProvider)
-> Ord EmbedProvider
EmbedProvider -> EmbedProvider -> Bool
EmbedProvider -> EmbedProvider -> Ordering
EmbedProvider -> EmbedProvider -> EmbedProvider
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EmbedProvider -> EmbedProvider -> EmbedProvider
$cmin :: EmbedProvider -> EmbedProvider -> EmbedProvider
max :: EmbedProvider -> EmbedProvider -> EmbedProvider
$cmax :: EmbedProvider -> EmbedProvider -> EmbedProvider
>= :: EmbedProvider -> EmbedProvider -> Bool
$c>= :: EmbedProvider -> EmbedProvider -> Bool
> :: EmbedProvider -> EmbedProvider -> Bool
$c> :: EmbedProvider -> EmbedProvider -> Bool
<= :: EmbedProvider -> EmbedProvider -> Bool
$c<= :: EmbedProvider -> EmbedProvider -> Bool
< :: EmbedProvider -> EmbedProvider -> Bool
$c< :: EmbedProvider -> EmbedProvider -> Bool
compare :: EmbedProvider -> EmbedProvider -> Ordering
$ccompare :: EmbedProvider -> EmbedProvider -> Ordering
$cp1Ord :: Eq EmbedProvider
Ord)

instance ToJSON EmbedProvider where
  toJSON :: EmbedProvider -> Value
toJSON (EmbedProvider Maybe Text
a Maybe Text
b) = [Pair] -> Value
object
    [ Text
"name" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
a
    , Text
"url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
b
    ]

instance FromJSON EmbedProvider where
  parseJSON :: Value -> Parser EmbedProvider
parseJSON = String
-> (Object -> Parser EmbedProvider)
-> Value
-> Parser EmbedProvider
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"provider" ((Object -> Parser EmbedProvider) -> Value -> Parser EmbedProvider)
-> (Object -> Parser EmbedProvider)
-> Value
-> Parser EmbedProvider
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe Text -> Maybe Text -> EmbedProvider
EmbedProvider (Maybe Text -> Maybe Text -> EmbedProvider)
-> Parser (Maybe Text) -> Parser (Maybe Text -> EmbedProvider)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"name"
                  Parser (Maybe Text -> EmbedProvider)
-> Parser (Maybe Text) -> Parser EmbedProvider
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"url"

data EmbedAuthor = EmbedAuthor
  { EmbedAuthor -> Maybe Text
embedAuthorName :: Maybe T.Text
  , EmbedAuthor -> Maybe Text
embedAuthorUrl :: Maybe T.Text
  , EmbedAuthor -> Maybe Text
embedAuthorIconUrl :: Maybe T.Text
  , EmbedAuthor -> Maybe Text
embedAuthorProxyIconUrl :: Maybe T.Text
  } deriving (Int -> EmbedAuthor -> ShowS
[EmbedAuthor] -> ShowS
EmbedAuthor -> String
(Int -> EmbedAuthor -> ShowS)
-> (EmbedAuthor -> String)
-> ([EmbedAuthor] -> ShowS)
-> Show EmbedAuthor
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmbedAuthor] -> ShowS
$cshowList :: [EmbedAuthor] -> ShowS
show :: EmbedAuthor -> String
$cshow :: EmbedAuthor -> String
showsPrec :: Int -> EmbedAuthor -> ShowS
$cshowsPrec :: Int -> EmbedAuthor -> ShowS
Show, EmbedAuthor -> EmbedAuthor -> Bool
(EmbedAuthor -> EmbedAuthor -> Bool)
-> (EmbedAuthor -> EmbedAuthor -> Bool) -> Eq EmbedAuthor
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EmbedAuthor -> EmbedAuthor -> Bool
$c/= :: EmbedAuthor -> EmbedAuthor -> Bool
== :: EmbedAuthor -> EmbedAuthor -> Bool
$c== :: EmbedAuthor -> EmbedAuthor -> Bool
Eq, Eq EmbedAuthor
Eq EmbedAuthor
-> (EmbedAuthor -> EmbedAuthor -> Ordering)
-> (EmbedAuthor -> EmbedAuthor -> Bool)
-> (EmbedAuthor -> EmbedAuthor -> Bool)
-> (EmbedAuthor -> EmbedAuthor -> Bool)
-> (EmbedAuthor -> EmbedAuthor -> Bool)
-> (EmbedAuthor -> EmbedAuthor -> EmbedAuthor)
-> (EmbedAuthor -> EmbedAuthor -> EmbedAuthor)
-> Ord EmbedAuthor
EmbedAuthor -> EmbedAuthor -> Bool
EmbedAuthor -> EmbedAuthor -> Ordering
EmbedAuthor -> EmbedAuthor -> EmbedAuthor
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EmbedAuthor -> EmbedAuthor -> EmbedAuthor
$cmin :: EmbedAuthor -> EmbedAuthor -> EmbedAuthor
max :: EmbedAuthor -> EmbedAuthor -> EmbedAuthor
$cmax :: EmbedAuthor -> EmbedAuthor -> EmbedAuthor
>= :: EmbedAuthor -> EmbedAuthor -> Bool
$c>= :: EmbedAuthor -> EmbedAuthor -> Bool
> :: EmbedAuthor -> EmbedAuthor -> Bool
$c> :: EmbedAuthor -> EmbedAuthor -> Bool
<= :: EmbedAuthor -> EmbedAuthor -> Bool
$c<= :: EmbedAuthor -> EmbedAuthor -> Bool
< :: EmbedAuthor -> EmbedAuthor -> Bool
$c< :: EmbedAuthor -> EmbedAuthor -> Bool
compare :: EmbedAuthor -> EmbedAuthor -> Ordering
$ccompare :: EmbedAuthor -> EmbedAuthor -> Ordering
$cp1Ord :: Eq EmbedAuthor
Ord)

instance ToJSON EmbedAuthor where
  toJSON :: EmbedAuthor -> Value
toJSON (EmbedAuthor Maybe Text
a Maybe Text
b Maybe Text
c Maybe Text
d) = [Pair] -> Value
object
    [ Text
"name" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
a
    , Text
"url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
b
    , Text
"icon_url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
c
    , Text
"proxy_icon_url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
d
    ]

instance FromJSON EmbedAuthor where
  parseJSON :: Value -> Parser EmbedAuthor
parseJSON = String
-> (Object -> Parser EmbedAuthor) -> Value -> Parser EmbedAuthor
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"author" ((Object -> Parser EmbedAuthor) -> Value -> Parser EmbedAuthor)
-> (Object -> Parser EmbedAuthor) -> Value -> Parser EmbedAuthor
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> EmbedAuthor
EmbedAuthor (Maybe Text
 -> Maybe Text -> Maybe Text -> Maybe Text -> EmbedAuthor)
-> Parser (Maybe Text)
-> Parser (Maybe Text -> Maybe Text -> Maybe Text -> EmbedAuthor)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"name"
                Parser (Maybe Text -> Maybe Text -> Maybe Text -> EmbedAuthor)
-> Parser (Maybe Text)
-> Parser (Maybe Text -> Maybe Text -> EmbedAuthor)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"url"
                Parser (Maybe Text -> Maybe Text -> EmbedAuthor)
-> Parser (Maybe Text) -> Parser (Maybe Text -> EmbedAuthor)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"icon_url"
                Parser (Maybe Text -> EmbedAuthor)
-> Parser (Maybe Text) -> Parser EmbedAuthor
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"proxy_icon_url"

data EmbedFooter = EmbedFooter
  { EmbedFooter -> Text
embedFooterText :: T.Text
  , EmbedFooter -> Maybe Text
embedFooterIconUrl :: Maybe T.Text
  , EmbedFooter -> Maybe Text
embedFooterProxyIconUrl :: Maybe T.Text
  } deriving (Int -> EmbedFooter -> ShowS
[EmbedFooter] -> ShowS
EmbedFooter -> String
(Int -> EmbedFooter -> ShowS)
-> (EmbedFooter -> String)
-> ([EmbedFooter] -> ShowS)
-> Show EmbedFooter
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmbedFooter] -> ShowS
$cshowList :: [EmbedFooter] -> ShowS
show :: EmbedFooter -> String
$cshow :: EmbedFooter -> String
showsPrec :: Int -> EmbedFooter -> ShowS
$cshowsPrec :: Int -> EmbedFooter -> ShowS
Show, EmbedFooter -> EmbedFooter -> Bool
(EmbedFooter -> EmbedFooter -> Bool)
-> (EmbedFooter -> EmbedFooter -> Bool) -> Eq EmbedFooter
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EmbedFooter -> EmbedFooter -> Bool
$c/= :: EmbedFooter -> EmbedFooter -> Bool
== :: EmbedFooter -> EmbedFooter -> Bool
$c== :: EmbedFooter -> EmbedFooter -> Bool
Eq, Eq EmbedFooter
Eq EmbedFooter
-> (EmbedFooter -> EmbedFooter -> Ordering)
-> (EmbedFooter -> EmbedFooter -> Bool)
-> (EmbedFooter -> EmbedFooter -> Bool)
-> (EmbedFooter -> EmbedFooter -> Bool)
-> (EmbedFooter -> EmbedFooter -> Bool)
-> (EmbedFooter -> EmbedFooter -> EmbedFooter)
-> (EmbedFooter -> EmbedFooter -> EmbedFooter)
-> Ord EmbedFooter
EmbedFooter -> EmbedFooter -> Bool
EmbedFooter -> EmbedFooter -> Ordering
EmbedFooter -> EmbedFooter -> EmbedFooter
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EmbedFooter -> EmbedFooter -> EmbedFooter
$cmin :: EmbedFooter -> EmbedFooter -> EmbedFooter
max :: EmbedFooter -> EmbedFooter -> EmbedFooter
$cmax :: EmbedFooter -> EmbedFooter -> EmbedFooter
>= :: EmbedFooter -> EmbedFooter -> Bool
$c>= :: EmbedFooter -> EmbedFooter -> Bool
> :: EmbedFooter -> EmbedFooter -> Bool
$c> :: EmbedFooter -> EmbedFooter -> Bool
<= :: EmbedFooter -> EmbedFooter -> Bool
$c<= :: EmbedFooter -> EmbedFooter -> Bool
< :: EmbedFooter -> EmbedFooter -> Bool
$c< :: EmbedFooter -> EmbedFooter -> Bool
compare :: EmbedFooter -> EmbedFooter -> Ordering
$ccompare :: EmbedFooter -> EmbedFooter -> Ordering
$cp1Ord :: Eq EmbedFooter
Ord)

instance ToJSON EmbedFooter where
  toJSON :: EmbedFooter -> Value
toJSON (EmbedFooter Text
a Maybe Text
b Maybe Text
c) = [Pair] -> Value
object
    [ Text
"text" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Text
a
    , Text
"icon_url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
b
    , Text
"proxy_icon_url" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
c
    ]

instance FromJSON EmbedFooter where
  parseJSON :: Value -> Parser EmbedFooter
parseJSON = String
-> (Object -> Parser EmbedFooter) -> Value -> Parser EmbedFooter
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"footer" ((Object -> Parser EmbedFooter) -> Value -> Parser EmbedFooter)
-> (Object -> Parser EmbedFooter) -> Value -> Parser EmbedFooter
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Text -> Maybe Text -> Maybe Text -> EmbedFooter
EmbedFooter (Text -> Maybe Text -> Maybe Text -> EmbedFooter)
-> Parser Text -> Parser (Maybe Text -> Maybe Text -> EmbedFooter)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"text"
                Parser (Maybe Text -> Maybe Text -> EmbedFooter)
-> Parser (Maybe Text) -> Parser (Maybe Text -> EmbedFooter)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"icon_url"
                Parser (Maybe Text -> EmbedFooter)
-> Parser (Maybe Text) -> Parser EmbedFooter
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"proxy_icon_url"

data EmbedField = EmbedField
  { EmbedField -> Text
embedFieldName :: T.Text
  , EmbedField -> Text
embedFieldValue :: T.Text
  , EmbedField -> Maybe Bool
embedFieldInline :: Maybe Bool
  } deriving (Int -> EmbedField -> ShowS
[EmbedField] -> ShowS
EmbedField -> String
(Int -> EmbedField -> ShowS)
-> (EmbedField -> String)
-> ([EmbedField] -> ShowS)
-> Show EmbedField
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmbedField] -> ShowS
$cshowList :: [EmbedField] -> ShowS
show :: EmbedField -> String
$cshow :: EmbedField -> String
showsPrec :: Int -> EmbedField -> ShowS
$cshowsPrec :: Int -> EmbedField -> ShowS
Show, EmbedField -> EmbedField -> Bool
(EmbedField -> EmbedField -> Bool)
-> (EmbedField -> EmbedField -> Bool) -> Eq EmbedField
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EmbedField -> EmbedField -> Bool
$c/= :: EmbedField -> EmbedField -> Bool
== :: EmbedField -> EmbedField -> Bool
$c== :: EmbedField -> EmbedField -> Bool
Eq, Eq EmbedField
Eq EmbedField
-> (EmbedField -> EmbedField -> Ordering)
-> (EmbedField -> EmbedField -> Bool)
-> (EmbedField -> EmbedField -> Bool)
-> (EmbedField -> EmbedField -> Bool)
-> (EmbedField -> EmbedField -> Bool)
-> (EmbedField -> EmbedField -> EmbedField)
-> (EmbedField -> EmbedField -> EmbedField)
-> Ord EmbedField
EmbedField -> EmbedField -> Bool
EmbedField -> EmbedField -> Ordering
EmbedField -> EmbedField -> EmbedField
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EmbedField -> EmbedField -> EmbedField
$cmin :: EmbedField -> EmbedField -> EmbedField
max :: EmbedField -> EmbedField -> EmbedField
$cmax :: EmbedField -> EmbedField -> EmbedField
>= :: EmbedField -> EmbedField -> Bool
$c>= :: EmbedField -> EmbedField -> Bool
> :: EmbedField -> EmbedField -> Bool
$c> :: EmbedField -> EmbedField -> Bool
<= :: EmbedField -> EmbedField -> Bool
$c<= :: EmbedField -> EmbedField -> Bool
< :: EmbedField -> EmbedField -> Bool
$c< :: EmbedField -> EmbedField -> Bool
compare :: EmbedField -> EmbedField -> Ordering
$ccompare :: EmbedField -> EmbedField -> Ordering
$cp1Ord :: Eq EmbedField
Ord)

instance ToJSON EmbedField where
  toJSON :: EmbedField -> Value
toJSON (EmbedField Text
a Text
b Maybe Bool
c) = [Pair] -> Value
object
    [ Text
"name" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Text
a
    , Text
"value" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Text
b
    , Text
"inline" Text -> Maybe Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Bool
c
    ]

instance FromJSON EmbedField where
  parseJSON :: Value -> Parser EmbedField
parseJSON = String
-> (Object -> Parser EmbedField) -> Value -> Parser EmbedField
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"field" ((Object -> Parser EmbedField) -> Value -> Parser EmbedField)
-> (Object -> Parser EmbedField) -> Value -> Parser EmbedField
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Text -> Text -> Maybe Bool -> EmbedField
EmbedField (Text -> Text -> Maybe Bool -> EmbedField)
-> Parser Text -> Parser (Text -> Maybe Bool -> EmbedField)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
               Parser (Text -> Maybe Bool -> EmbedField)
-> Parser Text -> Parser (Maybe Bool -> EmbedField)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"value"
               Parser (Maybe Bool -> EmbedField)
-> Parser (Maybe Bool) -> Parser EmbedField
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"inline"