@@ -1,3 +1,4 @@
1{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3{-# LANGUAGE LambdaCase #-}
4{-# LANGUAGE LambdaCase #-}
@@ -33,12 +34,18 @@ where
33import qualified Control.Monad.IO.Class as MIO
34import qualified Control.Monad.IO.Class as MIO
34import qualified Control.Monad.Reader as MR
35import qualified Control.Monad.Reader as MR
35import qualified Control.Monad.Trans.Class as MT
36import 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
42+import qualified Data.HashMap.Strict as HashMap
36import qualified Data.Aeson as Aeson
44import qualified Data.Aeson as Aeson
37import qualified Data.Aeson.Encoding as Encoding
45import qualified Data.Aeson.Encoding as Encoding
38import qualified Data.Bifunctor as BF
46import qualified Data.Bifunctor as BF
39import qualified Data.ByteString.Char8 as B8
47import qualified Data.ByteString.Char8 as B8
40import qualified Data.ByteString.Lazy.Char8 as LB8
48import qualified Data.ByteString.Lazy.Char8 as LB8
41−import qualified Data.HashMap.Strict as HMap
42import qualified Data.Maybe as Maybe
49import qualified Data.Maybe as Maybe
43import qualified Data.Scientific as Scientific
50import qualified Data.Scientific as Scientific
44import Data.Text (Text)
51import Data.Text (Text)
@@ -50,6 +57,15 @@ import qualified Network.HTTP.Client as HC
50import qualified Network.HTTP.Simple as HS
57import qualified Network.HTTP.Simple as HS
51import qualified Network.HTTP.Types as HT
58import qualified Network.HTTP.Types as HT
61+#if MIN_VERSION_aeson(2,0,0)
62+toList' :: Aeson.Object -> [(Text, Aeson.Value)]
63+toList' = fmap (first Key.toText) . KeyMap.toList
65+toList' :: Aeson.Object -> [(Text, Aeson.Value)]
66+toList' = HashMap.toList
53-- | Abstracts the usage of 'Network.HTTP.Simple.httpBS' away,
69-- | Abstracts the usage of 'Network.HTTP.Simple.httpBS' away,
54-- so that it can be used for testing
70-- so that it can be used for testing
55class Monad m => MonadHTTP m where
71class Monad m => MonadHTTP m where
@@ -285,8 +301,10 @@ jsonToFormDataFlat _ Aeson.Null = []
285jsonToFormDataFlat name (Aeson.Number a) = [(name, encodeStrict a)]
301jsonToFormDataFlat name (Aeson.Number a) = [(name, encodeStrict a)]
286jsonToFormDataFlat name (Aeson.String a) = [(name, textToByte a)]
302jsonToFormDataFlat name (Aeson.String a) = [(name, textToByte a)]
287jsonToFormDataFlat name (Aeson.Bool a) = [(name, encodeStrict a)]
303jsonToFormDataFlat name (Aeson.Bool a) = [(name, encodeStrict a)]
304+jsonToFormDataFlat _ (Aeson.Object object) =
288−jsonToFormDataFlat _ (Aeson.Object object) = HMap.toList object >>= uncurry jsonToFormDataFlat . BF.first Just
305+ toList' object >>= uncurry jsonToFormDataFlat . BF.first Just
306+jsonToFormDataFlat name (Aeson.Array vector) =
289−jsonToFormDataFlat name (Aeson.Array vector) = Vector.toList vector >>= jsonToFormDataFlat name
307+ Vector.toList vector >>= jsonToFormDataFlat name
291-- | creates form data bytestring array
309-- | creates form data bytestring array
292createFormData :: (Aeson.ToJSON a) => a -> [(B8.ByteString, B8.ByteString)]
310createFormData :: (Aeson.ToJSON a) => a -> [(B8.ByteString, B8.ByteString)]
@@ -320,9 +338,9 @@ jsonToFormDataPrefixed prefix (Aeson.Bool False) = [(prefix, "false")]
320jsonToFormDataPrefixed _ Aeson.Null = []
338jsonToFormDataPrefixed _ Aeson.Null = []
321jsonToFormDataPrefixed prefix (Aeson.String a) = [(prefix, a)]
339jsonToFormDataPrefixed prefix (Aeson.String a) = [(prefix, a)]
322jsonToFormDataPrefixed "" (Aeson.Object object) =
340jsonToFormDataPrefixed "" (Aeson.Object object) =
323− HMap.toList object >>= uncurry jsonToFormDataPrefixed
341+ toList' object >>= uncurry jsonToFormDataPrefixed
324jsonToFormDataPrefixed prefix (Aeson.Object object) =
342jsonToFormDataPrefixed prefix (Aeson.Object object) =
325− HMap.toList object >>= (\(x, y) -> jsonToFormDataPrefixed (prefix <> "[" <> x <> "]") y)
343+ toList' object >>= (\(x, y) -> jsonToFormDataPrefixed (prefix <> "[" <> x <> "]") y)
326jsonToFormDataPrefixed prefix (Aeson.Array vector) =
344jsonToFormDataPrefixed prefix (Aeson.Array vector) =
327 Vector.toList vector >>= jsonToFormDataPrefixed (prefix <> "[]")
345 Vector.toList vector >>= jsonToFormDataPrefixed (prefix <> "[]")