packages feed

minion-0.1.0.0: src/Web/Minion/Media/Json.hs

module Web.Minion.Media.Json where

import Data.Aeson (FromJSON, ToJSON, eitherDecode)
import Data.Aeson qualified as Aeson
import Data.Bifunctor (Bifunctor (..))
import Data.ByteString.Builder qualified as Bytes.Builder
import Data.List.NonEmpty qualified as Nel
import Data.Text qualified as Text
import Network.HTTP.Media qualified as Http
import Network.HTTP.Types qualified as Http
import Network.Wai qualified as Wai
import Web.Minion.Media
import Web.Minion.Request.Body
import Web.Minion.Response.Body (Encode (encode))

data Json

instance ContentType Json where
  media =
    "application" Http.// "json" Http./: ("charset", "utf-8")
      Nel.:| ["application" Http.// "json"]

instance (FromJSON a) => Decode Json a where
  decode = first Text.pack . eitherDecode

instance (ToJSON a) => Encode Json a where
  encode a =
    Wai.responseBuilder
      Http.status200
      [(Http.hContentType, Http.renderHeader $ Nel.head $ media @Json)]
      (Bytes.Builder.lazyByteString $ Aeson.encode a)