diff options
Diffstat (limited to 'src/Notmuch/SearchResult.hs')
-rw-r--r-- | src/Notmuch/SearchResult.hs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/Notmuch/SearchResult.hs b/src/Notmuch/SearchResult.hs new file mode 100644 index 0000000..a59fa9c --- /dev/null +++ b/src/Notmuch/SearchResult.hs @@ -0,0 +1,61 @@ +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE OverloadedStrings #-} +module Notmuch.SearchResult where + +import Data.Aeson +import Data.Text +import Data.Time.Clock +import Data.Time.Clock.POSIX +import Notmuch.Class + + +newtype ThreadID = ThreadID { unThreadID :: String } + deriving (Show,Read,Eq,FromJSON,ToJSON) + + +-- | A single entry returned from the notmuch search command. +data SearchResult = SearchResult { + searchThread :: ThreadID + , searchTime :: UTCTime + , searchDateRel :: Text + , searchSubject :: Text + , searchAuthors :: Text + , searchQuery :: [Maybe Text] -- TODO (Text, Maybe Text) + , searchTags :: [Text] + , searchMatched :: Int + , searchTotal :: Int + } + deriving (Show) + + +instance Eq SearchResult where + s1 == s2 = + searchThread s1 == searchThread s2 + + +instance HasNotmuchId SearchResult where + notmuchId = unThreadID . searchThread + + +instance FromJSON SearchResult where + parseJSON (Object v) = SearchResult <$> (ThreadID . ("thread:"++) <$> v .: "thread") + <*> (posixSecondsToUTCTime . fromInteger <$> v .: "timestamp") + <*> v .: "date_relative" + <*> v .:? "subject" .!= "" + <*> v .:? "authors" .!= "" + <*> v .:? "query" .!= [] + <*> v .: "tags" + <*> v .: "matched" + <*> v .: "total" + parseJSON x = fail $ "Error parsing search: " ++ show x + +--instance ToJSON SearchResult where +-- toJSON s = object [ "thread" .= searchThread s +-- , "time" .= searchTime s +-- , "date_relative" .= searchDateRel s +-- , "subject" .= searchSubject s +-- , "authors" .= searchAuthors s +-- , "tags" .= searchTags s +-- , "matched" .= searchMatched s +-- , "total" .= searchTotal s +-- ] |