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.PersistentBrowser.Util
import Scion.PersistentBrowser.DbTypes
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 -> SQL [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
liftIO $ logToStdout q
liftIO $ logToStdout output
let search = runP hoogleElements () "hoogle-output" (output)
case search of
Right result -> do dbResult <- result
return dbResult
Left perr -> do
liftIO $ logToStdout $ show perr
return []
_ -> do liftIO $ logToStdout err
return []
downloadData :: Maybe String -> IO HoogleStatus
downloadData p = do mpath <- findHoogleBinPath p
case mpath of
Nothing -> return Missing
Just path -> do logToStdout "Downloading hoogle data..."
(ec, _, err) <- readProcessWithExitCode path ["data"] ""
when (ec/= ExitSuccess) (do
logToStdout path
logToStdout err)
return $ case ec of
ExitSuccess->OK
_-> Error
checkDatabase :: Maybe String -> IO HoogleStatus
checkDatabase p = do mpath <- findHoogleBinPath p
case mpath of
Nothing -> return Missing
Just path -> do (ec, _, err) <- readProcessWithExitCode path ["fmap"] ""
when (ec/= ExitSuccess) (do
logToStdout path
logToStdout err)
return $ case ec of
ExitSuccess->OK
_-> Error