{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}

module Prod.MimeTypes where

import Data.ByteString (ByteString)
import Data.ByteString.Lazy (fromStrict)
import qualified Network.HTTP.Media as M
import Servant
import System.IO.Unsafe

data HTML

data PNG

data SVG

data GraphPictureData
    = GraphPictureData
    { GraphPictureData -> ByteString
graphvizInput :: !ByteString
    , GraphPictureData -> IO ByteString
serializedPng :: (IO ByteString)
    , GraphPictureData -> IO ByteString
serializedSvg :: (IO ByteString)
    }

instance Accept HTML where
    contentType :: Proxy HTML -> MediaType
contentType Proxy HTML
_ = ByteString
"text" ByteString -> ByteString -> MediaType
M.// ByteString
"html" MediaType -> (ByteString, ByteString) -> MediaType
M./: (ByteString
"charset", ByteString
"utf-8")

instance Accept PNG where
    contentType :: Proxy PNG -> MediaType
contentType Proxy PNG
_ = ByteString
"image" ByteString -> ByteString -> MediaType
M.// ByteString
"png"

instance MimeRender PNG GraphPictureData where
    mimeRender :: Proxy PNG -> GraphPictureData -> ByteString
mimeRender Proxy PNG
_ = ByteString -> ByteString
fromStrict (ByteString -> ByteString)
-> (GraphPictureData -> ByteString)
-> GraphPictureData
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO ByteString -> ByteString
forall a. IO a -> a
unsafePerformIO (IO ByteString -> ByteString)
-> (GraphPictureData -> IO ByteString)
-> GraphPictureData
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GraphPictureData -> IO ByteString
serializedPng

instance MimeRender PlainText GraphPictureData where
    mimeRender :: Proxy PlainText -> GraphPictureData -> ByteString
mimeRender Proxy PlainText
_ = ByteString -> ByteString
fromStrict (ByteString -> ByteString)
-> (GraphPictureData -> ByteString)
-> GraphPictureData
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GraphPictureData -> ByteString
graphvizInput

instance Accept SVG where
    contentType :: Proxy SVG -> MediaType
contentType Proxy SVG
_ = ByteString
"image" ByteString -> ByteString -> MediaType
M.// ByteString
"svg"

instance MimeRender SVG GraphPictureData where
    mimeRender :: Proxy SVG -> GraphPictureData -> ByteString
mimeRender Proxy SVG
_ = ByteString -> ByteString
fromStrict (ByteString -> ByteString)
-> (GraphPictureData -> ByteString)
-> GraphPictureData
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO ByteString -> ByteString
forall a. IO a -> a
unsafePerformIO (IO ByteString -> ByteString)
-> (GraphPictureData -> IO ByteString)
-> GraphPictureData
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GraphPictureData -> IO ByteString
serializedSvg