@@ -19,7 +19,7 @@ module Servant.CSV.Cassava where
19import Data.Csv
19import Data.Csv
20import Data.Proxy (Proxy (..))
20import Data.Proxy (Proxy (..))
21import Data.Typeable (Typeable)
21import Data.Typeable (Typeable)
22−import Data.Vector (Vector)
22+import Data.Vector (Vector, toList)
23import GHC.Generics (Generic)
23import GHC.Generics (Generic)
24import qualified Network.HTTP.Media as M
24import qualified Network.HTTP.Media as M
25import Servant.API (Accept (..), MimeRender (..),
25import Servant.API (Accept (..), MimeRender (..),
@@ -50,6 +50,18 @@ instance ( DefaultOrdered a, ToNamedRecord a, EncodeOpts opt
50 mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p)
50 mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p)
51 where p = Proxy :: Proxy opt
51 where p = Proxy :: Proxy opt
53+-- | Encode with 'encodeByNameWith'. The 'Header' param is used for determining
54+-- the order of headers and fields.
55+instance ( ToNamedRecord a, EncodeOpts opt
56+ ) => MimeRender (CSV', opt) (Header, Vector a) where
57+ mimeRender _ (hdr, vals) = encodeByNameWith (encodeOpts p) hdr (toList vals)
58+ where p = Proxy :: Proxy opt
60+-- | Encode with 'encodeDefaultOrderedByNameWith'
61+instance ( DefaultOrdered a, ToNamedRecord a, EncodeOpts opt
62+ ) => MimeRender (CSV', opt) (Vector a) where
63+ mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p) . toList
64+ where p = Proxy :: Proxy opt
54-- ** Encode Options
66-- ** Encode Options
@@ -66,6 +78,17 @@ instance EncodeOpts DefaultEncodeOpts where
66-- ** Instances
78-- ** Instances
68-- | Decode with 'decodeByNameWith'
80-- | Decode with 'decodeByNameWith'
81+instance ( FromNamedRecord a, DecodeOpts opt
82+ ) => MimeUnrender (CSV', opt) (Header, [a]) where
83+ mimeUnrender _ bs = fmap toList <$> decodeByNameWith (decodeOpts p) bs
84+ where p = Proxy :: Proxy opt
86+-- | Decode with 'decodeWith'. Assumes data has headers, which are stripped.
87+instance ( FromRecord a, DecodeOpts opt
88+ ) => MimeUnrender (CSV', opt) [a] where
89+ mimeUnrender _ bs = toList <$> decodeWith (decodeOpts p) HasHeader bs
90+ where p = Proxy :: Proxy opt
69instance ( FromNamedRecord a, DecodeOpts opt
92instance ( FromNamedRecord a, DecodeOpts opt
70 ) => MimeUnrender (CSV', opt) (Header, Vector a) where
93 ) => MimeUnrender (CSV', opt) (Header, Vector a) where
71 mimeUnrender _ = decodeByNameWith (decodeOpts p)
94 mimeUnrender _ = decodeByNameWith (decodeOpts p)