@@ -1,3 +1,4 @@
1{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE FlexibleInstances #-}
@@ -16,10 +17,13 @@
16-- >>> type EgDefault = Get '[CSV] [(Int, String)]
17-- >>> type EgDefault = Get '[CSV] [(Int, String)]
17module Servant.CSV.Cassava where
18module Servant.CSV.Cassava where
20+#if !MIN_VERSION_base(4,8,0)
21+import Control.Applicative ((<$>))
19import Data.Csv
23import Data.Csv
20import Data.Proxy (Proxy (..))
24import Data.Proxy (Proxy (..))
21import Data.Typeable (Typeable)
25import Data.Typeable (Typeable)
22−import Data.Vector (Vector)
26+import Data.Vector (Vector, toList)
23import GHC.Generics (Generic)
27import GHC.Generics (Generic)
24import qualified Network.HTTP.Media as M
28import qualified Network.HTTP.Media as M
25import Servant.API (Accept (..), MimeRender (..),
29import Servant.API (Accept (..), MimeRender (..),
@@ -50,6 +54,18 @@ instance ( DefaultOrdered a, ToNamedRecord a, EncodeOpts opt
50 mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p)
54 mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p)
51 where p = Proxy :: Proxy opt
55 where p = Proxy :: Proxy opt
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
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
54-- ** Encode Options
70-- ** Encode Options
@@ -66,6 +82,17 @@ instance EncodeOpts DefaultEncodeOpts where
66-- ** Instances
82-- ** Instances
68-- | Decode with 'decodeByNameWith'
84-- | 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
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
69instance ( FromNamedRecord a, DecodeOpts opt
96instance ( FromNamedRecord a, DecodeOpts opt
70 ) => MimeUnrender (CSV', opt) (Header, Vector a) where
97 ) => MimeUnrender (CSV', opt) (Header, Vector a) where
71 mimeUnrender _ = decodeByNameWith (decodeOpts p)
98 mimeUnrender _ = decodeByNameWith (decodeOpts p)