@@ -19,7 +19,7 @@ module Servant.CSV.Cassava where
1919import Data.Csv
2020import Data.Proxy (Proxy (..))
2121import Data.Typeable (Typeable)
22−import Data.Vector (Vector)
22+import Data.Vector (Vector, toList)
2323import GHC.Generics (Generic)
2424import qualified Network.HTTP.Media as M
2525import Servant.API (Accept (..), MimeRender (..),
@@ -50,6 +50,18 @@ instance ( DefaultOrdered a, ToNamedRecord a, EncodeOpts opt
5050 mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p)
5151 where p = Proxy :: Proxy opt
5252
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
59+
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
5365
5466-- ** Encode Options
5567
@@ -66,6 +78,17 @@ instance EncodeOpts DefaultEncodeOpts where
6678-- ** Instances
6779
6880-- | 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
85+
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
91+
6992instance ( FromNamedRecord a, DecodeOpts opt
7093 ) => MimeUnrender (CSV', opt) (Header, Vector a) where
7194 mimeUnrender _ = decodeByNameWith (decodeOpts p)