diff options
| author | Kierán Meinhardt <kieran.meinhardt@gmail.com> | 2020-09-23 17:44:40 +0200 | 
|---|---|---|
| committer | Kierán Meinhardt <kieran.meinhardt@gmail.com> | 2020-09-23 17:44:40 +0200 | 
| commit | 8e92e6e11d2b3b0bfb5ac9d68f347219493e6380 (patch) | |
| tree | 6484ca42d85ca89475e922f7b45039c116ebbf97 /src/Notmuch/SearchResult.hs | |
| parent | 6a6ad3aecd53ffd89101a0dee2b4ea576d4964d4 (diff) | |
split into library + executables
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 +--                      ]  | 
