packages feed

hoogle-4.0: src/Main.hs

module Main where

import CmdLine.All
import Web.All


main :: IO ()
main = do
    q <- cmdQuery
    if queryWeb q
        then actionWeb q
        else actionCmdLine q


{-



exec :: Origin -> Query -> IO ()

exec CmdLine q | not $ usefulQuery q = putStr $ "No query given\n" ++ helpMsg

exec CmdLine q = do
    checkFlags q (fColor ++ fDatabase ++ fStart ++ fCount ++ fDocs ++ fInfo)
    databases <- collectDataBases q
    res <- searcher databases
    if null res then putStrLn "No results found" else do
    
        when showInfo $ do
            putStrLn $ showTags $ renderResult $ head res
            putStrLn ""
            docs <- loadDocs $ itemResult $ head res
            case docs of
                Nothing -> putStrLn "No info on this item"
                Just x -> putStr $ showTags $ renderDocs x
        
        when (showInfo && showDocs) $ putStrLn ""
        when showDocs $ putStrLn $ fromMaybe "No documentation" $ locateWebDocs $ itemResult $ head res
        
        when (not (showDocs || showInfo)) $
            putStr $ unlines $ map (showTags . renderResult) res
    where
        showDocs = hasFlag q fDocs
        showInfo = hasFlag q fInfo
    
        showTags = if hasFlag q fColor then showTagConsole else showTag
        
        searcher dbs | isJust start || isJust count
                     = searchRange dbs q (fromMaybe 1 start - 1) (fromMaybe 25 count)
                     | otherwise = searchAll dbs q
        
        start = getPosIntFlag fStart
        count = getPosIntFlag fCount
        
        getPosIntFlag flags =
            case getFlag q flags of
                Nothing -> Nothing
                Just x ->
                    case (reads x :: [(Int,String)]) of
                        [(n,"")] | n > 0 -> Just n
                        _ -> Nothing
- }

{ - RULES
For each /db=... flag, it must be either a file (load it) or a folder (look for +packages in it)
If always check the current directory if all /db directives fail
If no /db files and no +packages then default to +base
- }
collectDataBases :: Query -> IO [DataBase]
collectDataBases q =  do
    (files,dirs) <- f (getFlags q fDatabase)
    let packs = [x | PlusPackage x <- scope q]
    files2 <- mapM (g (dirs++[""])) (if null packs && null files then ["base"] else packs)
    res <- mapM h (files ++ catMaybes files2)
    return $ catMaybes res
    where
        f :: [FilePath] -> IO ([FilePath],[FilePath])
        f [] = return ([], [])
        f (x:xs) = do
            bfile <- doesFileExist x
            bdir <- doesDirectoryExist x
            if not (bfile || bdir)
                then do
                    putStrLn $ "Warning, database not found: " ++ x
                    f xs
                else do
                    (a,b) <- f xs
                    return ([x|bfile]++a, [x|not bfile]++b)

        -- maybe return an item
        g :: [FilePath] -> String -> IO (Maybe FilePath)
        g (x:xs) y = do
            let file = x </> y <.> "hoo"
            b <- doesFileExist file
            if b then return $ Just file
                 else g xs y
        g [] y = do
            putStrLn $ "Warning, failed to find package " ++ y
            return Nothing

        h file = do
            db <- loadDataBase file
            when (isNothing db) $ putStrLn $ "Failed to load database, " ++ file
            return db
-}