{-|
Module      : Twfy.Data.JsonIso8859
Description : Content-Type not provided by Servant

Instances for Accept and MimeUnrender to allow Servant client to read 'text/javascript; charset=iso-8859-1'
-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Twfy.Data.JsonIso8859
       (
         JsonIso8859
       )
       where

import Prelude ()
import Prelude.Compat

import Servant
import Data.Aeson

import qualified Data.ByteString.Lazy as LBS
import qualified Data.Text.Encoding as TE
import qualified Network.HTTP.Media as Media

-- | Type for 'text/plain; charset=iso8859-1'
data JsonIso8859

instance Accept JsonIso8859 where
  contentType _ = "text" Media.// "javascript" Media./: ("charset", "iso-8859-1")

instance FromJSON a => MimeUnrender JsonIso8859 a where
  mimeUnrender _ = eitherDecode . from8859ToUtf8

from8859ToUtf8 :: LBS.ByteString -> LBS.ByteString
from8859ToUtf8 iso = let isoText = TE.decodeLatin1 $ LBS.toStrict iso
                         utf8 = TE.encodeUtf8 isoText
                     in LBS.fromStrict utf8