packages feed

calamity-0.2.0.0: Calamity/Types/Model/Channel/Attachment.hs

-- | Message attachments
module Calamity.Types.Model.Channel.Attachment (Attachment (..)) where

import Calamity.Internal.AesonThings ()
import Calamity.Types.Snowflake
import Data.Aeson
import Data.Text (Text)
import Data.Word
import GHC.Generics
import TextShow
import qualified TextShow.Generic as TSG

fuseTup2 :: Monad f => (f a, f b) -> f (a, b)
fuseTup2 (a, b) = do
  !a' <- a
  !b' <- b
  pure (a', b')

data Attachment = Attachment
  { id :: Snowflake Attachment
  , filename :: !Text
  , size :: Word64
  , url :: !Text
  , proxyUrl :: !Text
  , dimensions :: !(Maybe (Word64, Word64))
  }
  deriving (Eq, Show, Generic)
  deriving (TextShow) via TSG.FromGeneric Attachment
  deriving (HasID Attachment) via HasIDField "id" Attachment

instance ToJSON Attachment where
  toJSON Attachment{id, filename, size, url, proxyUrl, dimensions = Just (width, height)} =
    object
      [ "id" .= id
      , "filename" .= filename
      , "size" .= size
      , "url" .= url
      , "proxy_url" .= proxyUrl
      , "width" .= width
      , "height" .= height
      ]
  toJSON Attachment{id, filename, size, url, proxyUrl} =
    object ["id" .= id, "filename" .= filename, "size" .= size, "url" .= url, "proxy_url" .= proxyUrl]

instance FromJSON Attachment where
  parseJSON = withObject "Attachment" $ \v -> do
    width <- v .:? "width"
    height <- v .:? "height"

    Attachment <$> v .: "id" <*> v .: "filename" <*> v .: "size" <*> v .: "url" <*> v .: "proxy_url"
      <*> pure
        (fuseTup2 (width, height))