1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
{-|
Module : Gargantext.Utils.Servant
Description : Gargantext utilities
Copyright : (c) CNRS, 2017
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
-}
module Gargantext.Utils.Servant where
import Data.ByteString.Lazy.Char8 qualified as BSC
import Data.Csv (encodeDefaultOrderedByName, DefaultOrdered, ToNamedRecord)
import Data.Text qualified as T
import Data.Text.Encoding qualified as TE
import Network.HTTP.Media ((//), (/:))
import Prelude qualified
import Protolude
import Protolude.Partial (read)
import Servant ( Accept(contentType), MimeRender(..), MimeUnrender(mimeUnrender) )
data TSV = TSV
instance Accept TSV where
contentType _ = "text" // "csv" /: ("charset", "utf-8")
instance (DefaultOrdered a, ToNamedRecord a) => MimeRender TSV [a] where
mimeRender _ = encodeDefaultOrderedByName
instance MimeRender TSV T.Text where
mimeRender _ = BSC.fromStrict . TE.encodeUtf8
instance Read a => MimeUnrender TSV a where
mimeUnrender _ bs = case BSC.take len bs of
"text/csv" -> pure . read . BSC.unpack $ BSC.drop len bs
_ -> Left "didn't start with the magic incantation"
where
len :: Int64
len = fromIntegral $ length ("text/csv" :: Prelude.String)
--instance ToNamedRecord a => MimeRender TSV [a] where
-- mimeRender _ val = encode val
----------------------------
data Markdown = Markdown
instance Accept Markdown where
contentType _ = "text" // "markdown"
instance MimeRender Markdown T.Text where
mimeRender _ = BSC.fromStrict . TE.encodeUtf8
instance MimeUnrender Markdown T.Text where
mimeUnrender _ = Right . TE.decodeUtf8 . BSC.toStrict
---------------------------
data ZIP = ZIP
instance Accept ZIP where
contentType _ = "application" // "zip"
instance MimeRender ZIP BSC.ByteString where
mimeRender _ = identity
instance MimeUnrender ZIP BSC.ByteString where
mimeUnrender _ = Right . identity