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 ((forall x.
 UnembeddedMimeAttachments -> Rep UnembeddedMimeAttachments x)
-> (forall x.
    Rep UnembeddedMimeAttachments x -> UnembeddedMimeAttachments)
-> Generic UnembeddedMimeAttachments
forall x.
Rep UnembeddedMimeAttachments x -> UnembeddedMimeAttachments
forall x.
UnembeddedMimeAttachments -> Rep UnembeddedMimeAttachments x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
UnembeddedMimeAttachments -> Rep UnembeddedMimeAttachments x
from :: forall x.
UnembeddedMimeAttachments -> Rep UnembeddedMimeAttachments x
$cto :: forall x.
Rep UnembeddedMimeAttachments x -> UnembeddedMimeAttachments
to :: forall x.
Rep UnembeddedMimeAttachments x -> UnembeddedMimeAttachments
Generic, Int -> UnembeddedMimeAttachments -> ShowS
[UnembeddedMimeAttachments] -> ShowS
UnembeddedMimeAttachments -> String
(Int -> UnembeddedMimeAttachments -> ShowS)
-> (UnembeddedMimeAttachments -> String)
-> ([UnembeddedMimeAttachments] -> ShowS)
-> Show UnembeddedMimeAttachments
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UnembeddedMimeAttachments -> ShowS
showsPrec :: Int -> UnembeddedMimeAttachments -> ShowS
$cshow :: UnembeddedMimeAttachments -> String
show :: UnembeddedMimeAttachments -> String
$cshowList :: [UnembeddedMimeAttachments] -> ShowS
showList :: [UnembeddedMimeAttachments] -> ShowS
Show, UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
(UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool)
-> (UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool)
-> Eq UnembeddedMimeAttachments
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
== :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
$c/= :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
/= :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
Eq, Eq UnembeddedMimeAttachments
Eq UnembeddedMimeAttachments =>
(UnembeddedMimeAttachments
 -> UnembeddedMimeAttachments -> Ordering)
-> (UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool)
-> (UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool)
-> (UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool)
-> (UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool)
-> (UnembeddedMimeAttachments
    -> UnembeddedMimeAttachments -> UnembeddedMimeAttachments)
-> (UnembeddedMimeAttachments
    -> UnembeddedMimeAttachments -> UnembeddedMimeAttachments)
-> Ord UnembeddedMimeAttachments
UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Ordering
UnembeddedMimeAttachments
-> UnembeddedMimeAttachments -> UnembeddedMimeAttachments
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
$ccompare :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Ordering
compare :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Ordering
$c< :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
< :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
$c<= :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
<= :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
$c> :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
> :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
$c>= :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
>= :: UnembeddedMimeAttachments -> UnembeddedMimeAttachments -> Bool
$cmax :: UnembeddedMimeAttachments
-> UnembeddedMimeAttachments -> UnembeddedMimeAttachments
max :: UnembeddedMimeAttachments
-> UnembeddedMimeAttachments -> UnembeddedMimeAttachments
$cmin :: UnembeddedMimeAttachments
-> UnembeddedMimeAttachments -> UnembeddedMimeAttachments
min :: UnembeddedMimeAttachments
-> UnembeddedMimeAttachments -> UnembeddedMimeAttachments
Ord)

newtype UnembeddedMimeBundle = UnembeddedMimeBundle (Map Text UnembeddedMimeData)
  deriving ((forall x. UnembeddedMimeBundle -> Rep UnembeddedMimeBundle x)
-> (forall x. Rep UnembeddedMimeBundle x -> UnembeddedMimeBundle)
-> Generic UnembeddedMimeBundle
forall x. Rep UnembeddedMimeBundle x -> UnembeddedMimeBundle
forall x. UnembeddedMimeBundle -> Rep UnembeddedMimeBundle x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. UnembeddedMimeBundle -> Rep UnembeddedMimeBundle x
from :: forall x. UnembeddedMimeBundle -> Rep UnembeddedMimeBundle x
$cto :: forall x. Rep UnembeddedMimeBundle x -> UnembeddedMimeBundle
to :: forall x. Rep UnembeddedMimeBundle x -> UnembeddedMimeBundle
Generic, Int -> UnembeddedMimeBundle -> ShowS
[UnembeddedMimeBundle] -> ShowS
UnembeddedMimeBundle -> String
(Int -> UnembeddedMimeBundle -> ShowS)
-> (UnembeddedMimeBundle -> String)
-> ([UnembeddedMimeBundle] -> ShowS)
-> Show UnembeddedMimeBundle
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UnembeddedMimeBundle -> ShowS
showsPrec :: Int -> UnembeddedMimeBundle -> ShowS
$cshow :: UnembeddedMimeBundle -> String
show :: UnembeddedMimeBundle -> String
$cshowList :: [UnembeddedMimeBundle] -> ShowS
showList :: [UnembeddedMimeBundle] -> ShowS
Show, UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
(UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool)
-> (UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool)
-> Eq UnembeddedMimeBundle
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
== :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
$c/= :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
/= :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
Eq, Eq UnembeddedMimeBundle
Eq UnembeddedMimeBundle =>
(UnembeddedMimeBundle -> UnembeddedMimeBundle -> Ordering)
-> (UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool)
-> (UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool)
-> (UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool)
-> (UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool)
-> (UnembeddedMimeBundle
    -> UnembeddedMimeBundle -> UnembeddedMimeBundle)
-> (UnembeddedMimeBundle
    -> UnembeddedMimeBundle -> UnembeddedMimeBundle)
-> Ord UnembeddedMimeBundle
UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
UnembeddedMimeBundle -> UnembeddedMimeBundle -> Ordering
UnembeddedMimeBundle
-> UnembeddedMimeBundle -> UnembeddedMimeBundle
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
$ccompare :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Ordering
compare :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Ordering
$c< :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
< :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
$c<= :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
<= :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
$c> :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
> :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
$c>= :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
>= :: UnembeddedMimeBundle -> UnembeddedMimeBundle -> Bool
$cmax :: UnembeddedMimeBundle
-> UnembeddedMimeBundle -> UnembeddedMimeBundle
max :: UnembeddedMimeBundle
-> UnembeddedMimeBundle -> UnembeddedMimeBundle
$cmin :: UnembeddedMimeBundle
-> UnembeddedMimeBundle -> UnembeddedMimeBundle
min :: UnembeddedMimeBundle
-> UnembeddedMimeBundle -> UnembeddedMimeBundle
Ord)

data UnembeddedMimeData = BinaryData FilePath | TextualData Text | JsonData Aeson.Value
  deriving ((forall x. UnembeddedMimeData -> Rep UnembeddedMimeData x)
-> (forall x. Rep UnembeddedMimeData x -> UnembeddedMimeData)
-> Generic UnembeddedMimeData
forall x. Rep UnembeddedMimeData x -> UnembeddedMimeData
forall x. UnembeddedMimeData -> Rep UnembeddedMimeData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. UnembeddedMimeData -> Rep UnembeddedMimeData x
from :: forall x. UnembeddedMimeData -> Rep UnembeddedMimeData x
$cto :: forall x. Rep UnembeddedMimeData x -> UnembeddedMimeData
to :: forall x. Rep UnembeddedMimeData x -> UnembeddedMimeData
Generic, Int -> UnembeddedMimeData -> ShowS
[UnembeddedMimeData] -> ShowS
UnembeddedMimeData -> String
(Int -> UnembeddedMimeData -> ShowS)
-> (UnembeddedMimeData -> String)
-> ([UnembeddedMimeData] -> ShowS)
-> Show UnembeddedMimeData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UnembeddedMimeData -> ShowS
showsPrec :: Int -> UnembeddedMimeData -> ShowS
$cshow :: UnembeddedMimeData -> String
show :: UnembeddedMimeData -> String
$cshowList :: [UnembeddedMimeData] -> ShowS
showList :: [UnembeddedMimeData] -> ShowS
Show, UnembeddedMimeData -> UnembeddedMimeData -> Bool
(UnembeddedMimeData -> UnembeddedMimeData -> Bool)
-> (UnembeddedMimeData -> UnembeddedMimeData -> Bool)
-> Eq UnembeddedMimeData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
== :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
$c/= :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
/= :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
Eq, Eq UnembeddedMimeData
Eq UnembeddedMimeData =>
(UnembeddedMimeData -> UnembeddedMimeData -> Ordering)
-> (UnembeddedMimeData -> UnembeddedMimeData -> Bool)
-> (UnembeddedMimeData -> UnembeddedMimeData -> Bool)
-> (UnembeddedMimeData -> UnembeddedMimeData -> Bool)
-> (UnembeddedMimeData -> UnembeddedMimeData -> Bool)
-> (UnembeddedMimeData -> UnembeddedMimeData -> UnembeddedMimeData)
-> (UnembeddedMimeData -> UnembeddedMimeData -> UnembeddedMimeData)
-> Ord UnembeddedMimeData
UnembeddedMimeData -> UnembeddedMimeData -> Bool
UnembeddedMimeData -> UnembeddedMimeData -> Ordering
UnembeddedMimeData -> UnembeddedMimeData -> UnembeddedMimeData
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
$ccompare :: UnembeddedMimeData -> UnembeddedMimeData -> Ordering
compare :: UnembeddedMimeData -> UnembeddedMimeData -> Ordering
$c< :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
< :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
$c<= :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
<= :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
$c> :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
> :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
$c>= :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
>= :: UnembeddedMimeData -> UnembeddedMimeData -> Bool
$cmax :: UnembeddedMimeData -> UnembeddedMimeData -> UnembeddedMimeData
max :: UnembeddedMimeData -> UnembeddedMimeData -> UnembeddedMimeData
$cmin :: UnembeddedMimeData -> UnembeddedMimeData -> UnembeddedMimeData
min :: UnembeddedMimeData -> UnembeddedMimeData -> UnembeddedMimeData
Ord)

instance Aeson.ToJSON UnembeddedMimeAttachments

instance Aeson.FromJSON UnembeddedMimeAttachments

instance Aeson.ToJSON UnembeddedMimeBundle

instance Aeson.FromJSON UnembeddedMimeBundle

instance Aeson.ToJSON UnembeddedMimeData where
  toJSON :: UnembeddedMimeData -> Value
toJSON = Options -> UnembeddedMimeData -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
jsonOptions

instance Aeson.FromJSON UnembeddedMimeData where
  parseJSON :: Value -> Parser UnembeddedMimeData
parseJSON = Options -> Value -> Parser UnembeddedMimeData
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
Aeson.genericParseJSON Options
jsonOptions

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