@@ -1,3 +1,4 @@
1+{-# LANGUAGE CPP #-}
12{-# LANGUAGE DeriveDataTypeable #-}
23{-# LANGUAGE DeriveGeneric #-}
34{-# LANGUAGE FlexibleInstances #-}
@@ -16,10 +17,13 @@
1617-- >>> type EgDefault = Get '[CSV] [(Int, String)]
1718module Servant.CSV.Cassava where
1819
20+#if !MIN_VERSION_base(4,8,0)
21+import Control.Applicative ((<$>))
22+#endif
1923import Data.Csv
2024import Data.Proxy (Proxy (..))
2125import Data.Typeable (Typeable)
22−import Data.Vector (Vector)
26+import Data.Vector (Vector, toList)
2327import GHC.Generics (Generic)
2428import qualified Network.HTTP.Media as M
2529import Servant.API (Accept (..), MimeRender (..),
@@ -50,6 +54,18 @@ instance ( DefaultOrdered a, ToNamedRecord a, EncodeOpts opt
5054 mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p)
5155 where p = Proxy :: Proxy opt
5256
57+-- | Encode with 'encodeByNameWith'. The 'Header' param is used for determining
58+-- the order of headers and fields.
59+instance ( ToNamedRecord a, EncodeOpts opt
60+ ) => MimeRender (CSV', opt) (Header, Vector a) where
61+ mimeRender _ (hdr, vals) = encodeByNameWith (encodeOpts p) hdr (toList vals)
62+ where p = Proxy :: Proxy opt
63+
64+-- | Encode with 'encodeDefaultOrderedByNameWith'
65+instance ( DefaultOrdered a, ToNamedRecord a, EncodeOpts opt
66+ ) => MimeRender (CSV', opt) (Vector a) where
67+ mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p) . toList
68+ where p = Proxy :: Proxy opt
5369
5470-- ** Encode Options
5571
@@ -66,6 +82,17 @@ instance EncodeOpts DefaultEncodeOpts where
6682-- ** Instances
6783
6884-- | Decode with 'decodeByNameWith'
85+instance ( FromNamedRecord a, DecodeOpts opt
86+ ) => MimeUnrender (CSV', opt) (Header, [a]) where
87+ mimeUnrender _ bs = fmap toList <$> decodeByNameWith (decodeOpts p) bs
88+ where p = Proxy :: Proxy opt
89+
90+-- | Decode with 'decodeWith'. Assumes data has headers, which are stripped.
91+instance ( FromRecord a, DecodeOpts opt
92+ ) => MimeUnrender (CSV', opt) [a] where
93+ mimeUnrender _ bs = toList <$> decodeWith (decodeOpts p) HasHeader bs
94+ where p = Proxy :: Proxy opt
95+
6996instance ( FromNamedRecord a, DecodeOpts opt
7097 ) => MimeUnrender (CSV', opt) (Header, Vector a) where
7198 mimeUnrender _ = decodeByNameWith (decodeOpts p)