@@ -1,5 +1,6 @@
11-- Manually write instances.
22
3+{-# LANGUAGE CPP, PackageImports #-}
34{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
45{-# OPTIONS_GHC -fno-warn-orphans #-}
56
@@ -12,12 +13,19 @@ module Twitter.Manual
1213 ) where
1314
1415import Control.Applicative
15−import Data.Aeson hiding (Result)
1616import Data.Monoid ((<>))
1717import Prelude hiding (id)
1818import Twitter
1919
20+#ifndef HAS_BOTH_AESON_AND_BENCHMARKS
21+import Data.Aeson hiding (Result)
22+#else
23+import "aeson" Data.Aeson hiding (Result)
24+import qualified "aeson-benchmarks" Data.Aeson as B
25+#endif
26+
2027instance ToJSON Metadata where
28+
2129 toJSON Metadata{..} = object [
2230 "result_type" .= result_type
2331 ]
@@ -139,3 +147,128 @@ instance FromJSON Result where
139147 <*> v .: "max_id_str"
140148 <*> v .: "query"
141149 parseJSON _ = empty
150+
151+#ifdef HAS_BOTH_AESON_AND_BENCHMARKS
152+instance B.ToJSON Metadata where
153+ toJSON Metadata{..} = B.object [
154+ "result_type" B..= result_type
155+ ]
156+
157+ toEncoding Metadata{..} = B.pairs $
158+ "result_type" B..= result_type
159+
160+instance B.FromJSON Metadata where
161+ parseJSON (B.Object v) = Metadata <$> v B..: "result_type"
162+ parseJSON _ = empty
163+
164+instance B.ToJSON Geo where
165+ toJSON Geo{..} = B.object [
166+ "type_" B..= type_
167+ , "coordinates" B..= coordinates
168+ ]
169+
170+ toEncoding Geo{..} = B.pairs $
171+ "type_" B..= type_
172+ <> "coordinates" B..= coordinates
173+
174+instance B.FromJSON Geo where
175+ parseJSON (B.Object v) = Geo <$>
176+ v B..: "type_"
177+ <*> v B..: "coordinates"
178+ parseJSON _ = empty
179+
180+instance B.ToJSON Story where
181+ toJSON Story{..} = B.object [
182+ "from_user_id_str" B..= from_user_id_str
183+ , "profile_image_url" B..= profile_image_url
184+ , "created_at" B..= created_at
185+ , "from_user" B..= from_user
186+ , "id_str" B..= id_str
187+ , "metadata" B..= metadata
188+ , "to_user_id" B..= to_user_id
189+ , "text" B..= text
190+ , "id" B..= id
191+ , "from_user_id" B..= from_user_id
192+ , "geo" B..= geo
193+ , "iso_language_code" B..= iso_language_code
194+ , "to_user_id_str" B..= to_user_id_str
195+ , "source" B..= source
196+ ]
197+
198+ toEncoding Story{..} = B.pairs $
199+ "from_user_id_str" B..= from_user_id_str
200+ <> "profile_image_url" B..= profile_image_url
201+ <> "created_at" B..= created_at
202+ <> "from_user" B..= from_user
203+ <> "id_str" B..= id_str
204+ <> "metadata" B..= metadata
205+ <> "to_user_id" B..= to_user_id
206+ <> "text" B..= text
207+ <> "id" B..= id
208+ <> "from_user_id" B..= from_user_id
209+ <> "geo" B..= geo
210+ <> "iso_language_code" B..= iso_language_code
211+ <> "to_user_id_str" B..= to_user_id_str
212+ <> "source" B..= source
213+
214+instance B.FromJSON Story where
215+ parseJSON (B.Object v) = Story <$>
216+ v B..: "from_user_id_str"
217+ <*> v B..: "profile_image_url"
218+ <*> v B..: "created_at"
219+ <*> v B..: "from_user"
220+ <*> v B..: "id_str"
221+ <*> v B..: "metadata"
222+ <*> v B..: "to_user_id"
223+ <*> v B..: "text"
224+ <*> v B..: "id"
225+ <*> v B..: "from_user_id"
226+ <*> v B..: "geo"
227+ <*> v B..: "iso_language_code"
228+ <*> v B..: "to_user_id_str"
229+ <*> v B..: "source"
230+ parseJSON _ = empty
231+
232+instance B.ToJSON Result where
233+ toJSON Result{..} = B.object [
234+ "results" B..= results
235+ , "max_id" B..= max_id
236+ , "since_id" B..= since_id
237+ , "refresh_url" B..= refresh_url
238+ , "next_page" B..= next_page
239+ , "results_per_page" B..= results_per_page
240+ , "page" B..= page
241+ , "completed_in" B..= completed_in
242+ , "since_id_str" B..= since_id_str
243+ , "max_id_str" B..= max_id_str
244+ , "query" B..= query
245+ ]
246+
247+ toEncoding Result{..} = B.pairs $
248+ "results" B..= results
249+ <> "max_id" B..= max_id
250+ <> "since_id" B..= since_id
251+ <> "refresh_url" B..= refresh_url
252+ <> "next_page" B..= next_page
253+ <> "results_per_page" B..= results_per_page
254+ <> "page" B..= page
255+ <> "completed_in" B..= completed_in
256+ <> "since_id_str" B..= since_id_str
257+ <> "max_id_str" B..= max_id_str
258+ <> "query" B..= query
259+
260+instance B.FromJSON Result where
261+ parseJSON (B.Object v) = Result <$>
262+ v B..: "results"
263+ <*> v B..: "max_id"
264+ <*> v B..: "since_id"
265+ <*> v B..: "refresh_url"
266+ <*> v B..: "next_page"
267+ <*> v B..: "results_per_page"
268+ <*> v B..: "page"
269+ <*> v B..: "completed_in"
270+ <*> v B..: "since_id_str"
271+ <*> v B..: "max_id_str"
272+ <*> v B..: "query"
273+ parseJSON _ = empty
274+#endif