packages feed

nbparts-0.1.0.0: src/Nbparts/Types/Mime.hs

module Nbparts.Types.Mime
  ( UnembeddedMimeAttachments (..),
    UnembeddedMimeBundle (..),
    UnembeddedMimeData (..),
  )
where

import Data.Aeson (Options (constructorTagModifier, sumEncoding))
import Data.Aeson qualified as Aeson
import Data.Map (Map)
import Data.Text (Text)
import GHC.Generics (Generic)

newtype UnembeddedMimeAttachments = UnembeddedMimeAttachments (Map Text UnembeddedMimeBundle)
  deriving (Generic, Show, Eq, Ord)

newtype UnembeddedMimeBundle = UnembeddedMimeBundle (Map Text UnembeddedMimeData)
  deriving (Generic, Show, Eq, Ord)

data UnembeddedMimeData = BinaryData FilePath | TextualData Text | JsonData Aeson.Value
  deriving (Generic, Show, Eq, Ord)

instance Aeson.ToJSON UnembeddedMimeAttachments

instance Aeson.FromJSON UnembeddedMimeAttachments

instance Aeson.ToJSON UnembeddedMimeBundle

instance Aeson.FromJSON UnembeddedMimeBundle

instance Aeson.ToJSON UnembeddedMimeData where
  toJSON = Aeson.genericToJSON jsonOptions

instance Aeson.FromJSON UnembeddedMimeData where
  parseJSON = Aeson.genericParseJSON jsonOptions

jsonOptions :: Aeson.Options
jsonOptions =
  Aeson.defaultOptions
    { sumEncoding =
        Aeson.TaggedObject
          { tagFieldName = "type",
            contentsFieldName = "value"
          },
      constructorTagModifier = \case
        "BinaryData" -> "binary"
        "TextualData" -> "text"
        "JsonData" -> "json"
        other -> other
    }