{-# 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