1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
From 7af7586c5d244d07f77d49e5fdc739e6e8e54816 Mon Sep 17 00:00:00 2001
From: Joey Hess <joeyh@joeyh.name>
Date: Mon, 18 Oct 2021 14:35:30 -0400
Subject: [PATCH] build with aeson 2
---
Aws/DynamoDb/Commands/Table.hs | 4 +--
Aws/DynamoDb/Commands/UpdateItem.hs | 5 ++--
Aws/DynamoDb/Core.hs | 39 +++++++++++++++--------------
aws.cabal | 2 +-
4 files changed, 26 insertions(+), 24 deletions(-)
diff --git a/Aws/DynamoDb/Commands/Table.hs b/Aws/DynamoDb/Commands/Table.hs
index 5fb42e0..a5fe025 100644
--- a/Aws/DynamoDb/Commands/Table.hs
+++ b/Aws/DynamoDb/Commands/Table.hs
@@ -35,9 +35,9 @@ module Aws.DynamoDb.Commands.Table
import Control.Applicative
import Data.Aeson ((.!=), (.:), (.:?), (.=))
import qualified Data.Aeson as A
+import qualified Data.Aeson.KeyMap as KM
import qualified Data.Aeson.Types as A
import Data.Char (toUpper)
-import qualified Data.HashMap.Strict as M
import Data.Scientific (Scientific)
import qualified Data.Text as T
import Data.Time
@@ -281,7 +281,7 @@ data TableDescription
instance A.FromJSON TableDescription where
parseJSON = A.withObject "Table must be an object" $ \o -> do
- t <- case (M.lookup "Table" o, M.lookup "TableDescription" o) of
+ t <- case (KM.lookup "Table" o, KM.lookup "TableDescription" o) of
(Just (A.Object t), _) -> return t
(_, Just (A.Object t)) -> return t
_ -> fail "Table description must have key 'Table' or 'TableDescription'"
diff --git a/Aws/DynamoDb/Commands/UpdateItem.hs b/Aws/DynamoDb/Commands/UpdateItem.hs
index 0d94a59..1152b5a 100644
--- a/Aws/DynamoDb/Commands/UpdateItem.hs
+++ b/Aws/DynamoDb/Commands/UpdateItem.hs
@@ -31,6 +31,7 @@ module Aws.DynamoDb.Commands.UpdateItem
-------------------------------------------------------------------------------
import Control.Applicative
import Data.Aeson
+import qualified Data.Aeson.Key as AK
import Data.Default
import qualified Data.Text as T
import Prelude
@@ -91,9 +92,9 @@ instance ToJSON AttributeUpdates where
toJSON = object . map mk . getAttributeUpdates
where
mk AttributeUpdate { auAction = UDelete, auAttr = auAttr } =
- (attrName auAttr) .= object
+ (AK.fromText (attrName auAttr)) .= object
["Action" .= UDelete]
- mk AttributeUpdate { .. } = (attrName auAttr) .= object
+ mk AttributeUpdate { .. } = AK.fromText (attrName auAttr) .= object
["Value" .= (attrVal auAttr), "Action" .= auAction]
diff --git a/Aws/DynamoDb/Core.hs b/Aws/DynamoDb/Core.hs
index 1c116d3..b9a6cc4 100644
--- a/Aws/DynamoDb/Core.hs
+++ b/Aws/DynamoDb/Core.hs
@@ -128,6 +128,8 @@ import Control.Monad.Trans.Resource (throwM)
import qualified Crypto.Hash as CH
import Data.Aeson
import qualified Data.Aeson as A
+import qualified Data.Aeson.Key as AK
+import qualified Data.Aeson.KeyMap as KM
import Data.Aeson.Types (Pair, parseEither)
import qualified Data.Aeson.Types as A
import qualified Data.Attoparsec.ByteString as AttoB (endOfInput)
@@ -141,7 +143,6 @@ import Data.Conduit
import Data.Conduit.Attoparsec (sinkParser)
import Data.Default
import Data.Function (on)
-import qualified Data.HashMap.Strict as HM
import Data.Int
import Data.IORef
import Data.List
@@ -536,7 +537,7 @@ instance ToJSON PrimaryKey where
toJSON (PrimaryKey h (Just r)) =
let Object p1 = toJSON h
Object p2 = toJSON r
- in Object (p1 `HM.union` p2)
+ in Object (p1 `KM.union` p2)
instance FromJSON PrimaryKey where
parseJSON p = do
@@ -544,8 +545,8 @@ instance FromJSON PrimaryKey where
case length l of
1 -> return $ head l
_ -> fail "Unable to parse PrimaryKey"
- where listPKey p'= map (\(txt,dval)-> hk txt dval)
- . HM.toList <$> parseJSON p'
+ where listPKey p'= map (\(k,dval)-> hk (AK.toText k) dval)
+ . KM.toList <$> parseJSON p'
-- | A key-value pair
@@ -661,9 +662,9 @@ instance ToJSON Attribute where
-------------------------------------------------------------------------------
-- | Parse a JSON object that contains attributes
parseAttributeJson :: Value -> A.Parser [Attribute]
-parseAttributeJson (Object v) = mapM conv $ HM.toList v
+parseAttributeJson (Object v) = mapM conv $ KM.toList v
where
- conv (k, o) = Attribute k <$> parseJSON o
+ conv (k, o) = Attribute (AK.toText k) <$> parseJSON o
parseAttributeJson _ = error "Attribute JSON must be an Object"
@@ -674,7 +675,7 @@ attributesJson as = object $ map attributeJson as
-- | Convert into JSON pair
attributeJson :: Attribute -> Pair
-attributeJson (Attribute nm v) = nm .= v
+attributeJson (Attribute nm v) = AK.fromText nm .= v
-------------------------------------------------------------------------------
@@ -962,7 +963,7 @@ conditionsJson key (Conditions op es) = b ++ a
where
a = if null es
then []
- else [key .= object (map conditionJson es)]
+ else [AK.fromText key .= object (map conditionJson es)]
b = if length (take 2 es) > 1
then ["ConditionalOperator" .= String (rendCondOp op) ]
@@ -1046,7 +1047,7 @@ renderCondOp c = case c of
conditionJson :: Condition -> Pair
-conditionJson Condition{..} = condAttr .= condOp
+conditionJson Condition{..} = AK.fromText condAttr .= condOp
instance ToJSON CondOp where
@@ -1076,12 +1077,12 @@ data ConsumedCapacity = ConsumedCapacity {
instance FromJSON ConsumedCapacity where
- parseJSON (Object v) = ConsumedCapacity
- <$> v .: "CapacityUnits"
- <*> (HM.toList <$> v .:? "GlobalSecondaryIndexes" .!= mempty)
- <*> (HM.toList <$> v .:? "LocalSecondaryIndexes" .!= mempty)
- <*> (v .:? "Table" >>= maybe (return Nothing) (.: "CapacityUnits"))
- <*> v .: "TableName"
+ parseJSON (Object o) = ConsumedCapacity
+ <$> o .: "CapacityUnits"
+ <*> (map (\(k, v) -> (AK.toText k, v)) . KM.toList <$> o .:? "GlobalSecondaryIndexes" .!= mempty)
+ <*> (map (\(k, v) -> (AK.toText k, v)) . KM.toList <$> o .:? "LocalSecondaryIndexes" .!= mempty)
+ <*> (o .:? "Table" >>= maybe (return Nothing) (.: "CapacityUnits"))
+ <*> o .: "TableName"
parseJSON _ = fail "ConsumedCapacity must be an Object."
@@ -1115,8 +1116,8 @@ data ItemCollectionMetrics = ItemCollectionMetrics {
instance FromJSON ItemCollectionMetrics where
- parseJSON (Object v) = ItemCollectionMetrics
- <$> (do m <- v .: "ItemCollectionKey"
- return $ head $ HM.toList m)
- <*> v .: "SizeEstimateRangeGB"
+ parseJSON (Object o) = ItemCollectionMetrics
+ <$> (do m <- o .: "ItemCollectionKey"
+ return $ (\(k, v) -> (AK.toText k, v)) $ head $ KM.toList m)
+ <*> o .: "SizeEstimateRangeGB"
parseJSON _ = fail "ItemCollectionMetrics must be an Object."
--- a/aws.cabal 2022-07-25 08:47:06.270139909 +1000
+++ b/aws.cabal 2022-07-25 08:47:28.497479783 +1000
@@ -35,7 +35,7 @@
Default: True
Library
- build-depends: aeson <1.6
+ build-depends: aeson >= 2.0
Exposed-modules:
Aws
|