packages feed

scion-browser-0.2.3: src/Scion/PersistentHoogle.hs

module Scion.PersistentHoogle
( query
, downloadData
, checkDatabase
, module Scion.PersistentHoogle.Types
) where

import Control.Monad
import Control.Monad.IO.Class (liftIO)
import Database.Persist.Sqlite
import Scion.PersistentBrowser ()
import Scion.PersistentHoogle.Types
import Scion.PersistentHoogle.Instances.Json ()
import Scion.PersistentHoogle.Parser
import Scion.PersistentHoogle.Util
import System.Exit (ExitCode(..))
import System.Process
import Text.Parsec.Prim (runP)

query :: Maybe String -> String -> SqlPersist IO [Result]
query p q = do mpath <- liftIO $ findHoogleBinPath p
               case mpath of
                 Nothing   -> return []
                 Just path -> do (exitCode, output, err) <- liftIO $ readProcessWithExitCode path [q] ""
                                 case exitCode of
                                   ExitSuccess -> do let search = runP hoogleElements () "hoogle-output" (output)
                                                     case search of
                                                       Right result -> do dbResult <- result
                                                                          return dbResult
                                                       Left  _      -> return []
                                   _           -> do liftIO $ putStrLn err
                                                     return []

downloadData :: Maybe String -> IO Bool
downloadData p = do mpath <- findHoogleBinPath p
                    case mpath of
                      Nothing   -> return False
                      Just path -> do putStrLn "Running hoogle data..."
                                      (ec, _, err) <- readProcessWithExitCode path ["data"] ""
                                      when (ec/= ExitSuccess) (putStrLn err)
                                      return (ec == ExitSuccess)

checkDatabase :: Maybe String -> IO Bool
checkDatabase p = do mpath <- findHoogleBinPath p
                     case mpath of
                       Nothing   -> return False
                       Just path -> do (exitCode, _, _) <- readProcessWithExitCode path ["fmap"] ""
                                       return (exitCode == ExitSuccess)