-import Data.Maybe
-import Data.String.Utils (join, splitWs)
-import Data.Time (ZonedTime, formatTime, readsTime)
-import System.Locale (defaultTimeLocale, rfc822DateFormat)
-import Test.HUnit
-import Text.Regex (matchRegex, mkRegex)
-import Text.XML.HaXml
-import Text.XML.HaXml.Posn (noPos)
-
-import StringUtils (listify)
-import Twitter.User
-import Twitter.Xml
-
--- |Represents one Twitter status. We don't care about any of their
--- other properties.
-data Status = Status { status_id :: Integer,
- created_at :: String,
- text :: String,
- user :: User,
- reply :: Bool,
- retweet :: Bool }
- deriving (Show, Eq)
-
-
--- |Given some XML content, create a 'Status' from it.
-status_from_content :: Content i -> Maybe Status
-status_from_content content =
- if (length status_ids) == 0
- || (length created_ats) == 0
- || (length texts) == 0
- || (length users) == 0
- || (length retweeteds) == 0
- then
- Nothing
- else do
- first_status_id <- get_char_data (status_ids !! 0)
- integer_status_id <- parse_status_id first_status_id
- first_created_at <- get_char_data (created_ats !! 0)
- first_user <- user_from_content (users !! 0)
- first_retweeted <- get_char_data (retweeteds !! 0)
-
- let is_reply = case (length reply_to_status_ids) of
- 0 -> False
- _ -> True
-
- let is_retweet = case first_retweeted of
- "true" -> True
- _ -> False
-
- return (Status
- integer_status_id
- first_created_at
- all_text
- first_user
- is_reply
- is_retweet)
+import Control.Applicative ( (<$>), (<*>) )
+import Control.Monad ( liftM )
+import Data.Aeson ( (.:), FromJSON(..), Value(Object) )
+import Data.Maybe ( mapMaybe, isJust )
+import Data.Monoid ( mempty )
+import Data.String.Utils ( join, splitWs )
+import Data.Text ( pack )
+import Data.Time ( formatTime )
+import Data.Time.Clock ( UTCTime )
+import Data.Time.Format ( parseTime )
+import Data.Time.LocalTime ( TimeZone, utcToZonedTime )
+import System.Locale ( defaultTimeLocale, rfc822DateFormat )
+import Test.Framework ( Test, testGroup )
+import Test.Framework.Providers.HUnit ( testCase )
+import Test.HUnit ( Assertion, assertEqual )
+import Text.Regex ( matchRegex, mkRegex )
+
+import Html ( replace_entities )
+import StringUtils ( listify )
+import Twitter.User ( User(..), screen_name_to_timeline_url )
+
+data Status = Status {
+ created_at :: Maybe UTCTime,
+ status_id :: Integer,
+ reply :: Bool,
+ retweeted :: Bool,
+ text :: String,
+ user :: User
+ } deriving (Show, Eq)
+
+type Timeline = [Status]
+
+instance FromJSON Status where
+ parseJSON (Object t) =
+ Status <$>
+ liftM parse_status_time (t .: created_at_field) <*>
+ (t .: id_field) <*>
+ liftM isJustInt (t .: in_reply_to_status_id_field) <*>
+ (t .: retweeted_field) <*>
+ liftM replace_entities (t .: text_field) <*>
+ (t .: user_field)