-- | Message attachments module Calamity.Types.Model.Channel.Attachment ( Attachment(..) ) where import Calamity.Internal.AesonThings () import Calamity.Types.Snowflake import Data.Aeson import Data.Text.Lazy ( 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 toEncoding Attachment { id, filename, size, url, proxyUrl, dimensions = Just (width, height) } = pairs ("id" .= id <> "filename" .= filename <> "size" .= size <> "url" .= url <> "proxy_url" .= proxyUrl <> "width" .= width <> "height" .= height) toEncoding Attachment { id, filename, size, url, proxyUrl } = pairs ("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))