packages feed

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

{-# LANGUAGE TemplateHaskell #-}

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

import Calamity.Types.Snowflake
import Data.Aeson ((.:), (.:?))
import Data.Aeson qualified as Aeson
import Data.Text (Text)
import Data.Word
import Optics.TH
import TextShow.TH

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)
  deriving (HasID Attachment) via HasIDField "id" Attachment

$(deriveTextShow ''Attachment)
$(makeFieldLabelsNoPrefix ''Attachment)

instance Aeson.FromJSON Attachment where
  parseJSON = Aeson.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))