module Handler.Abook (getAbookQueryR) where
import Import
import Control.Exception.Lifted (try)
import Control.Monad.Trans.Resource (runResourceT)
import "process-conduit" Data.Conduit.Process
import System.Exit (ExitCode(..))
import qualified Data.Text as T
import qualified Data.Vector as V
import qualified Data.Conduit.List as C
import qualified Data.Conduit.Text as C
parseLine :: T.Text -> Value
parseLine x = case T.split (=='\t') x of
[] -> Null
[n] -> String n
(email:name:_) -> String $ T.concat [name, " <", email, ">"]
getAbookQueryR :: Handler Value
getAbookQueryR = do
q <- fromMaybe "" <$> lookupGetParam "q"
let p = proc "abook" ["--mutt-query", T.unpack q]
rs <- try $ runResourceT $ sourceProcess p $= C.decode C.utf8 $= C.lines $$ C.consume
return $ case rs of
Left (ExitFailure 1) -> Null
Left e -> object [ "error" .= show e ]
Right [] -> Null
Right [_] -> Null
Right (_:qs) -> Array $ V.fromList $ map parseLine qs