-import Data.Maybe
-import Data.String.Utils (join, splitWs)
-import Test.HUnit
-import Text.Regex (matchRegex, mkRegex)
-import Text.XML.HaXml
-
-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 }
- deriving (Show, Eq)
-
-
--- |Given some XML content, create a 'Status' from it.
-status_from_content :: Content -> (Maybe Status)
-status_from_content content =
-
- if (length status_ids) == 0
- || (length created_ats) == 0
- || (length texts) == 0
- || (length users) == 0
- then
- Nothing
- else
- case first_status_id of
- Nothing -> Nothing
- (Just status_id_data) ->
- case first_created_at of
- Nothing -> Nothing
- (Just created_at_data) ->
- case first_user of
- Nothing -> Nothing
- (Just user_object) ->
- case (reads status_id_data :: [(Integer, String)]) of
- [] -> Nothing
- parseresult:_ -> Just (Status (fst parseresult) created_at_data all_text user_object)
-
- where
- status_ids = (unique_id content)
- first_status_id = get_char_data (status_ids !! 0)
-
- created_ats = (status_created_at content)
- first_created_at = get_char_data (created_ats !! 0)
-
- texts = (status_text content)
- all_text = concat $ catMaybes (map get_char_data texts)
-
- users = (status_user content)
- first_user = user_from_content (users !! 0)
-
-
--- |Takes an XML String as an argument, and returns the
--- status that was parsed from it. Should only be used
--- on XML string where a <status> is a top-level element.
-parse_status :: String -> [Status]
-parse_status xml_data =
- catMaybes maybe_status
+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.Tasty ( TestTree, testGroup )
+import Test.Tasty.HUnit ( (@?=), testCase )
+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)