@@ -33,6 +33,13 @@ import Control.Monad.Trans.Resource (ResourceT, runResourceT)
3333import Control.Monad.State.Strict
3434import Control.Monad.Reader
3535import Data.Aeson
36+#if MIN_VERSION_aeson(2,0,0)
37+import qualified Data.Aeson.Key as K
38+import qualified Data.Aeson.KeyMap as M
39+import Data.Aeson.KeyMap (KeyMap)
40+#else
41+import qualified Data.HashMap.Strict as M
42+#endif
3643import Data.Aeson.Internal (JSONPath, JSONPathElement(..), formatError)
3744import Data.Aeson.Types hiding (parse)
3845import qualified Data.Attoparsec.Text as Atto
@@ -45,14 +52,13 @@ import Data.Char (toUpper, ord)
4552import Data.List
4653import Data.Conduit ((.|), ConduitM, runConduit)
4754import qualified Data.Conduit.List as CL
48−import qualified Data.HashMap.Strict as M
4955import qualified Data.HashSet as HashSet
5056import Data.Map (Map)
5157import qualified Data.Map as Map
5258import Data.Set (Set)
5359import qualified Data.Set as Set
5460import Data.Scientific (Scientific, base10Exponent, coefficient)
55−import Data.Text (Text, pack)
61+import Data.Text (Text)
5662import qualified Data.Text as T
5763import Data.Text.Encoding (decodeUtf8With, encodeUtf8)
5864import Data.Text.Encoding.Error (lenientDecode)
@@ -63,6 +69,22 @@ import Data.Void (Void)
6369import qualified Text.Libyaml as Y
6470import Text.Libyaml hiding (encode, decode, encodeFile, decodeFile)
6571
72+#if MIN_VERSION_aeson(2,0,0)
73+fromText :: T.Text -> K.Key
74+fromText = K.fromText
75+
76+toText :: K.Key -> T.Text
77+toText = K.toText
78+#else
79+fromText :: T.Text -> T.Text
80+fromText = id
81+
82+toText :: Key -> T.Text
83+toText = id
84+
85+type KeyMap a = M.HashMap Text a
86+#endif
87+
6688data ParseException = NonScalarKey
6789 | UnknownAlias { _anchorName :: Y.AnchorName }
6890 | UnexpectedEvent { _received :: Maybe Event
@@ -255,9 +277,9 @@ parseS !n a front = do
255277 o <- local (Index n :) parseO
256278 parseS (succ n) a $ front . (:) o
257279
258−parseM :: Set Text
280+parseM :: Set Key
259281 -> Y.Anchor
260− -> M.HashMap Text Value
282+ -> KeyMap Value
261283 -> ReaderT JSONPath (ConduitM Event o Parse) Value
262284parseM mergedKeys a front = do
263285 me <- lift CL.head
@@ -268,12 +290,12 @@ parseM mergedKeys a front = do
268290 return res
269291 _ -> do
270292 s <- case me of
271− Just (EventScalar v tag style a') -> parseScalar v a' style tag
293+ Just (EventScalar v tag style a') -> fromText <$> parseScalar v a' style tag
272294 Just (EventAlias an) -> do
273295 m <- lookupAnchor an
274296 case m of
275297 Nothing -> liftIO $ throwIO $ UnknownAlias an
276− Just (String t) -> return t
298+ Just (String t) -> return $ fromText t
277299 Just v -> liftIO $ throwIO $ NonStringKeyAlias an v
278300 _ -> do
279301 path <- ask
@@ -286,7 +308,7 @@ parseM mergedKeys a front = do
286308 path <- reverse <$> ask
287309 addWarning (DuplicateKey path)
288310 return (Set.delete s mergedKeys, M.insert s o front)
289− if s == pack "<<"
311+ if s == "<<"
290312 then case o of
291313 Object l -> return (merge l)
292314 Array l -> return $ merge $ foldl' mergeObjects M.empty $ V.toList l
@@ -417,7 +439,7 @@ objToEvents stringStyle = objToEvents' . toJSON
417439 : foldr pairToEvents (EventMappingEnd : rest) (M.toList o)
418440 where
419441 pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
420− pairToEvents (k, v) = objToEvents' (String k) . objToEvents' v
442+ pairToEvents (k, v) = objToEvents' (String $ toText k) . objToEvents' v
421443
422444 objToEvents' (String s) rest = stringScalar stringStyle Nothing s : rest
423445