@@ -1,3 +1,4 @@
1+{-# LANGUAGE CPP #-}
12{-# LANGUAGE FlexibleInstances #-}
23{-# LANGUAGE GeneralizedNewtypeDeriving #-}
34{-# LANGUAGE LambdaCase #-}
@@ -33,12 +34,18 @@ where
3334import qualified Control.Monad.IO.Class as MIO
3435import qualified Control.Monad.Reader as MR
3536import qualified Control.Monad.Trans.Class as MT
37+#if MIN_VERSION_aeson(2,0,0)
38+import qualified Data.Aeson.KeyMap as KeyMap
39+import qualified Data.Aeson.Key as Key
40+import Data.Bifunctor
41+#else
42+import qualified Data.HashMap.Strict as HashMap
43+#endif
3644import qualified Data.Aeson as Aeson
3745import qualified Data.Aeson.Encoding as Encoding
3846import qualified Data.Bifunctor as BF
3947import qualified Data.ByteString.Char8 as B8
4048import qualified Data.ByteString.Lazy.Char8 as LB8
41−import qualified Data.HashMap.Strict as HMap
4249import qualified Data.Maybe as Maybe
4350import qualified Data.Scientific as Scientific
4451import Data.Text (Text)
@@ -50,6 +57,15 @@ import qualified Network.HTTP.Client as HC
5057import qualified Network.HTTP.Simple as HS
5158import qualified Network.HTTP.Types as HT
5259
60+
61+#if MIN_VERSION_aeson(2,0,0)
62+toList' :: Aeson.Object -> [(Text, Aeson.Value)]
63+toList' = fmap (first Key.toText) . KeyMap.toList
64+#else
65+toList' :: Aeson.Object -> [(Text, Aeson.Value)]
66+toList' = HashMap.toList
67+#endif
68+
5369-- | Abstracts the usage of 'Network.HTTP.Simple.httpBS' away,
5470-- so that it can be used for testing
5571class Monad m => MonadHTTP m where
@@ -285,8 +301,10 @@ jsonToFormDataFlat _ Aeson.Null = []
285301jsonToFormDataFlat name (Aeson.Number a) = [(name, encodeStrict a)]
286302jsonToFormDataFlat name (Aeson.String a) = [(name, textToByte a)]
287303jsonToFormDataFlat name (Aeson.Bool a) = [(name, encodeStrict a)]
288−jsonToFormDataFlat _ (Aeson.Object object) = HMap.toList object >>= uncurry jsonToFormDataFlat . BF.first Just
289−jsonToFormDataFlat name (Aeson.Array vector) = Vector.toList vector >>= jsonToFormDataFlat name
304+jsonToFormDataFlat _ (Aeson.Object object) =
305+ toList' object >>= uncurry jsonToFormDataFlat . BF.first Just
306+jsonToFormDataFlat name (Aeson.Array vector) =
307+ Vector.toList vector >>= jsonToFormDataFlat name
290308
291309-- | creates form data bytestring array
292310createFormData :: (Aeson.ToJSON a) => a -> [(B8.ByteString, B8.ByteString)]
@@ -320,9 +338,9 @@ jsonToFormDataPrefixed prefix (Aeson.Bool False) = [(prefix, "false")]
320338jsonToFormDataPrefixed _ Aeson.Null = []
321339jsonToFormDataPrefixed prefix (Aeson.String a) = [(prefix, a)]
322340jsonToFormDataPrefixed "" (Aeson.Object object) =
323− HMap.toList object >>= uncurry jsonToFormDataPrefixed
341+ toList' object >>= uncurry jsonToFormDataPrefixed
324342jsonToFormDataPrefixed prefix (Aeson.Object object) =
325− HMap.toList object >>= (\(x, y) -> jsonToFormDataPrefixed (prefix <> "[" <> x <> "]") y)
343+ toList' object >>= (\(x, y) -> jsonToFormDataPrefixed (prefix <> "[" <> x <> "]") y)
326344jsonToFormDataPrefixed prefix (Aeson.Array vector) =
327345 Vector.toList vector >>= jsonToFormDataPrefixed (prefix <> "[]")
328346