{-# LANGUAGE DeriveDataTypeable, RecordWildCards #-}
{-# OPTIONS_GHC -fno-warn-missing-fields -fno-cse #-}

module Action.CmdLine(
    CmdLine(..), Language(..),
    getCmdLine, defaultDatabaseLang,
    defaultGenerate,
    whenLoud, whenNormal
    ) where

import System.Console.CmdArgs
import System.Directory
import System.Environment
import System.FilePath
import Data.List.Extra
import Data.Version
import General.Util
import Paths_hoogle(version)

data Language = Haskell | Frege deriving (Typeable Language
DataType
Constr
Typeable Language
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Language -> c Language)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Language)
-> (Language -> Constr)
-> (Language -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Language))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language))
-> ((forall b. Data b => b -> b) -> Language -> Language)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Language -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Language -> r)
-> (forall u. (forall d. Data d => d -> u) -> Language -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Language -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> Data Language
Language -> DataType
Language -> Constr
(forall b. Data b => b -> b) -> Language -> Language
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
forall u. (forall d. Data d => d -> u) -> Language -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
$cFrege :: Constr
$cHaskell :: Constr
$tLanguage :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Language -> m Language
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapMp :: (forall d. Data d => d -> m d) -> Language -> m Language
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapM :: (forall d. Data d => d -> m d) -> Language -> m Language
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapQi :: Int -> (forall d. Data d => d -> u) -> Language -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
gmapQ :: (forall d. Data d => d -> u) -> Language -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Language -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
gmapT :: (forall b. Data b => b -> b) -> Language -> Language
$cgmapT :: (forall b. Data b => b -> b) -> Language -> Language
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Language)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
dataTypeOf :: Language -> DataType
$cdataTypeOf :: Language -> DataType
toConstr :: Language -> Constr
$ctoConstr :: Language -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
$cp1Data :: Typeable Language
Data,Typeable,Int -> Language -> ShowS
[Language] -> ShowS
Language -> String
(Int -> Language -> ShowS)
-> (Language -> String) -> ([Language] -> ShowS) -> Show Language
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Language] -> ShowS
$cshowList :: [Language] -> ShowS
show :: Language -> String
$cshow :: Language -> String
showsPrec :: Int -> Language -> ShowS
$cshowsPrec :: Int -> Language -> ShowS
Show,Language -> Language -> Bool
(Language -> Language -> Bool)
-> (Language -> Language -> Bool) -> Eq Language
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Language -> Language -> Bool
$c/= :: Language -> Language -> Bool
== :: Language -> Language -> Bool
$c== :: Language -> Language -> Bool
Eq,Int -> Language
Language -> Int
Language -> [Language]
Language -> Language
Language -> Language -> [Language]
Language -> Language -> Language -> [Language]
(Language -> Language)
-> (Language -> Language)
-> (Int -> Language)
-> (Language -> Int)
-> (Language -> [Language])
-> (Language -> Language -> [Language])
-> (Language -> Language -> [Language])
-> (Language -> Language -> Language -> [Language])
-> Enum Language
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Language -> Language -> Language -> [Language]
$cenumFromThenTo :: Language -> Language -> Language -> [Language]
enumFromTo :: Language -> Language -> [Language]
$cenumFromTo :: Language -> Language -> [Language]
enumFromThen :: Language -> Language -> [Language]
$cenumFromThen :: Language -> Language -> [Language]
enumFrom :: Language -> [Language]
$cenumFrom :: Language -> [Language]
fromEnum :: Language -> Int
$cfromEnum :: Language -> Int
toEnum :: Int -> Language
$ctoEnum :: Int -> Language
pred :: Language -> Language
$cpred :: Language -> Language
succ :: Language -> Language
$csucc :: Language -> Language
Enum,Language
Language -> Language -> Bounded Language
forall a. a -> a -> Bounded a
maxBound :: Language
$cmaxBound :: Language
minBound :: Language
$cminBound :: Language
Bounded)

data CmdLine
    = Search
        {CmdLine -> Maybe Bool
color :: Maybe Bool
        ,CmdLine -> Bool
json :: Bool
        ,CmdLine -> Bool
link :: Bool
        ,CmdLine -> Bool
numbers :: Bool
        ,CmdLine -> Bool
info :: Bool
        ,CmdLine -> String
database :: FilePath
        ,CmdLine -> Maybe Int
count :: Maybe Int
        ,CmdLine -> [String]
query :: [String]
        ,CmdLine -> Int
repeat_ :: Int
        ,CmdLine -> Language
language :: Language
        ,CmdLine -> [String]
compare_ :: [String]
        }
    | Generate
        {CmdLine -> Maybe Bool
download :: Maybe Bool
        ,database :: FilePath
        ,CmdLine -> Bool
insecure :: Bool
        ,CmdLine -> [String]
include :: [String]
        ,count :: Maybe Int
        ,CmdLine -> [String]
local_ :: [FilePath]
        ,CmdLine -> Maybe String
haddock :: Maybe FilePath
        ,CmdLine -> Bool
debug :: Bool
        ,language :: Language
        }
    | Server
        {CmdLine -> Int
port :: Int
        ,database :: FilePath
        ,CmdLine -> String
cdn :: String
        ,CmdLine -> String
logs :: FilePath
        ,CmdLine -> Bool
local :: Bool
        ,haddock :: Maybe FilePath
        ,CmdLine -> Bool
links :: Bool
        ,language :: Language
        ,CmdLine -> String
scope :: String
        ,CmdLine -> String
home :: String
        ,CmdLine -> String
host :: String
        ,CmdLine -> Bool
https :: Bool
        ,CmdLine -> String
cert :: FilePath
        ,CmdLine -> String
key :: FilePath
        ,CmdLine -> Maybe String
datadir :: Maybe FilePath
        ,CmdLine -> Bool
no_security_headers :: Bool
        }
    | Replay
        {logs :: FilePath
        ,database :: FilePath
        ,repeat_ :: Int
        ,language :: Language
        ,scope :: String
        }
    | Test
        { CmdLine -> Bool
deep :: Bool
        , CmdLine -> Bool
disable_network_tests  :: Bool
        , database :: FilePath
        , language :: Language
        }
      deriving (Typeable CmdLine
DataType
Constr
Typeable CmdLine
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> CmdLine -> c CmdLine)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c CmdLine)
-> (CmdLine -> Constr)
-> (CmdLine -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c CmdLine))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c CmdLine))
-> ((forall b. Data b => b -> b) -> CmdLine -> CmdLine)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> CmdLine -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> CmdLine -> r)
-> (forall u. (forall d. Data d => d -> u) -> CmdLine -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> CmdLine -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> CmdLine -> m CmdLine)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> CmdLine -> m CmdLine)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> CmdLine -> m CmdLine)
-> Data CmdLine
CmdLine -> DataType
CmdLine -> Constr
(forall b. Data b => b -> b) -> CmdLine -> CmdLine
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> CmdLine -> c CmdLine
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c CmdLine
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> CmdLine -> u
forall u. (forall d. Data d => d -> u) -> CmdLine -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> CmdLine -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> CmdLine -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> CmdLine -> m CmdLine
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CmdLine -> m CmdLine
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c CmdLine
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> CmdLine -> c CmdLine
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c CmdLine)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c CmdLine)
$cTest :: Constr
$cReplay :: Constr
$cServer :: Constr
$cGenerate :: Constr
$cSearch :: Constr
$tCmdLine :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> CmdLine -> m CmdLine
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CmdLine -> m CmdLine
gmapMp :: (forall d. Data d => d -> m d) -> CmdLine -> m CmdLine
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CmdLine -> m CmdLine
gmapM :: (forall d. Data d => d -> m d) -> CmdLine -> m CmdLine
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> CmdLine -> m CmdLine
gmapQi :: Int -> (forall d. Data d => d -> u) -> CmdLine -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> CmdLine -> u
gmapQ :: (forall d. Data d => d -> u) -> CmdLine -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> CmdLine -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> CmdLine -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> CmdLine -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> CmdLine -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> CmdLine -> r
gmapT :: (forall b. Data b => b -> b) -> CmdLine -> CmdLine
$cgmapT :: (forall b. Data b => b -> b) -> CmdLine -> CmdLine
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c CmdLine)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c CmdLine)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c CmdLine)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c CmdLine)
dataTypeOf :: CmdLine -> DataType
$cdataTypeOf :: CmdLine -> DataType
toConstr :: CmdLine -> Constr
$ctoConstr :: CmdLine -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c CmdLine
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c CmdLine
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> CmdLine -> c CmdLine
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> CmdLine -> c CmdLine
$cp1Data :: Typeable CmdLine
Data,Typeable,Int -> CmdLine -> ShowS
[CmdLine] -> ShowS
CmdLine -> String
(Int -> CmdLine -> ShowS)
-> (CmdLine -> String) -> ([CmdLine] -> ShowS) -> Show CmdLine
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CmdLine] -> ShowS
$cshowList :: [CmdLine] -> ShowS
show :: CmdLine -> String
$cshow :: CmdLine -> String
showsPrec :: Int -> CmdLine -> ShowS
$cshowsPrec :: Int -> CmdLine -> ShowS
Show)

defaultDatabaseLang :: Language -> IO FilePath
defaultDatabaseLang :: Language -> IO String
defaultDatabaseLang Language
lang = do
    String
dir <- String -> IO String
getAppUserDataDirectory String
"hoogle"
    String -> IO String
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> IO String) -> String -> IO String
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"default-" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
lower (Language -> String
forall a. Show a => a -> String
show Language
lang) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"-" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
showVersion (Int -> Version -> Version
trimVersion Int
3 Version
version) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".hoo"

getCmdLine :: [String] -> IO CmdLine
getCmdLine :: [String] -> IO CmdLine
getCmdLine [String]
args = do
    CmdLine
args <- [String] -> IO CmdLine -> IO CmdLine
forall a. [String] -> IO a -> IO a
withArgs [String]
args (IO CmdLine -> IO CmdLine) -> IO CmdLine -> IO CmdLine
forall a b. (a -> b) -> a -> b
$ Mode (CmdArgs CmdLine) -> IO CmdLine
forall a. Mode (CmdArgs a) -> IO a
cmdArgsRun Mode (CmdArgs CmdLine)
cmdLineMode

    -- fill in the default database
    CmdLine
args <- if CmdLine -> String
database CmdLine
args String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"" then CmdLine -> IO CmdLine
forall (f :: * -> *) a. Applicative f => a -> f a
pure CmdLine
args else do
        String
db <- Language -> IO String
defaultDatabaseLang (Language -> IO String) -> Language -> IO String
forall a b. (a -> b) -> a -> b
$ CmdLine -> Language
language CmdLine
args; CmdLine -> IO CmdLine
forall (f :: * -> *) a. Applicative f => a -> f a
pure CmdLine
args{database :: String
database=String
db}

    -- fix up people using Hoogle 4 instructions
    CmdLine
args <- case CmdLine
args of
        Generate{Bool
String
[String]
Maybe Bool
Maybe Int
Maybe String
Language
language :: Language
debug :: Bool
haddock :: Maybe String
local_ :: [String]
count :: Maybe Int
include :: [String]
insecure :: Bool
database :: String
download :: Maybe Bool
debug :: CmdLine -> Bool
haddock :: CmdLine -> Maybe String
local_ :: CmdLine -> [String]
include :: CmdLine -> [String]
insecure :: CmdLine -> Bool
download :: CmdLine -> Maybe Bool
language :: CmdLine -> Language
count :: CmdLine -> Maybe Int
database :: CmdLine -> String
..} | String
"all" String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
include -> do
            String -> IO ()
putStrLn String
"Warning: 'all' argument is no longer required, and has been ignored."
            CmdLine -> IO CmdLine
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CmdLine -> IO CmdLine) -> CmdLine -> IO CmdLine
forall a b. (a -> b) -> a -> b
$ CmdLine
args{include :: [String]
include = String -> [String] -> [String]
forall a. Eq a => a -> [a] -> [a]
delete String
"all" [String]
include}
        CmdLine
_ -> CmdLine -> IO CmdLine
forall (f :: * -> *) a. Applicative f => a -> f a
pure CmdLine
args

    CmdLine -> IO CmdLine
forall (f :: * -> *) a. Applicative f => a -> f a
pure CmdLine
args


defaultGenerate :: CmdLine
defaultGenerate :: CmdLine
defaultGenerate = CmdLine
generate{language :: Language
language=Language
Haskell}


cmdLineMode :: Mode (CmdArgs CmdLine)
cmdLineMode = CmdLine -> Mode (CmdArgs CmdLine)
forall a. Data a => a -> Mode (CmdArgs a)
cmdArgsMode (CmdLine -> Mode (CmdArgs CmdLine))
-> CmdLine -> Mode (CmdArgs CmdLine)
forall a b. (a -> b) -> a -> b
$ [CmdLine] -> CmdLine
forall val. Data val => [val] -> val
modes [CmdLine
search_ CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= Ann
auto,CmdLine
generate,CmdLine
server,CmdLine
replay,CmdLine
test]
    CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= Ann
verbosity CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= String -> Ann
program String
"hoogle"
    CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= String -> Ann
summary (String
"Hoogle " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
showVersion Version
version String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", https://hoogle.haskell.org/")

search_ :: CmdLine
search_ = Search :: Maybe Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> Maybe Int
-> [String]
-> Int
-> Language
-> [String]
-> CmdLine
Search
    {color :: Maybe Bool
color = Maybe Bool
forall a. Default a => a
def Maybe Bool -> Ann -> Maybe Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"colour" Maybe Bool -> Ann -> Maybe Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Use colored output (requires ANSI terminal)"
    ,json :: Bool
json = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"json" Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Get result as JSON"
    ,link :: Bool
link = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Give URL's for each result"
    ,numbers :: Bool
numbers = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Give counter for each result"
    ,info :: Bool
info = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Give extended information about the first result"
    ,database :: String
database = String
forall a. Default a => a
def String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= Ann
typFile String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Name of database to use (use .hoo extension)"
    ,count :: Maybe Int
count = Maybe Int
forall a. Maybe a
Nothing Maybe Int -> Ann -> Maybe Int
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"n" Maybe Int -> Ann -> Maybe Int
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Maximum number of results to return (defaults to 10)"
    ,query :: [String]
query = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= Ann
args [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"QUERY"
    ,repeat_ :: Int
repeat_ = Int
1 Int -> Ann -> Int
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Number of times to repeat (for benchmarking)"
    ,language :: Language
language = [Language] -> Language
forall val. Data val => [val] -> val
enum [Language
x Language -> Ann -> Language
forall val. Data val => val -> Ann -> val
&= Ann
explicit Language -> Ann -> Language
forall val. Data val => val -> Ann -> val
&= String -> Ann
name (ShowS
lower ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Language -> String
forall a. Show a => a -> String
show Language
x) Language -> Ann -> Language
forall val. Data val => val -> Ann -> val
&= String -> Ann
help (String
"Work with " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Language -> String
forall a. Show a => a -> String
show Language
x) | Language
x <- [Language]
forall a. (Enum a, Bounded a) => [a]
enumerate] Language -> Ann -> Language
forall val. Data val => val -> Ann -> val
&= String -> Ann
groupname String
"Language"
    ,compare_ :: [String]
compare_ = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Type signatures to compare against"
    } CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Perform a search"

generate :: CmdLine
generate = Generate :: Maybe Bool
-> String
-> Bool
-> [String]
-> Maybe Int
-> [String]
-> Maybe String
-> Bool
-> Language
-> CmdLine
Generate
    {download :: Maybe Bool
download = Maybe Bool
forall a. Default a => a
def Maybe Bool -> Ann -> Maybe Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Download all files from the web"
    ,insecure :: Bool
insecure = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Allow insecure HTTPS connections"
    ,include :: [String]
include = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= Ann
args [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"PACKAGE"
    ,local_ :: [String]
local_ = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
forall a. (Show a, Typeable a) => a -> Ann
opt String
"" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Index local packages and link to local haddock docs"
    ,count :: Maybe Int
count = Maybe Int
forall a. Maybe a
Nothing Maybe Int -> Ann -> Maybe Int
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"n" Maybe Int -> Ann -> Maybe Int
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Maximum number of packages to index (defaults to all)"
    ,haddock :: Maybe String
haddock = Maybe String
forall a. Default a => a
def Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Use local haddocks"
    ,debug :: Bool
debug = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Generate debug information"
    } CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Generate Hoogle databases"

server :: CmdLine
server = Server :: Int
-> String
-> String
-> String
-> Bool
-> Maybe String
-> Bool
-> Language
-> String
-> String
-> String
-> Bool
-> String
-> String
-> Maybe String
-> Bool
-> CmdLine
Server
    {port :: Int
port = Int
8080 Int -> Ann -> Int
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"INT" Int -> Ann -> Int
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Port number"
    ,cdn :: String
cdn = String
"" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"URL" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"URL prefix to use"
    ,logs :: String
logs = String
"" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
forall a. (Show a, Typeable a) => a -> Ann
opt String
"log.txt" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= Ann
typFile String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"File to log requests to (defaults to stdout)"
    ,local :: Bool
local = Bool
False Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Allow following file:// links, restricts to 127.0.0.1  Set --host explicitely (including to '*' for any host) to override the localhost-only behaviour"
    ,haddock :: Maybe String
haddock = Maybe String
forall a. Default a => a
def Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Serve local haddocks from a specified directory"
    ,scope :: String
scope = String
forall a. Default a => a
def String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Default scope to start with"
    ,links :: Bool
links = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Display extra links"
    ,home :: String
home = String
"https://hoogle.haskell.org" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"URL" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Set the URL linked to by the Hoogle logo."
    ,host :: String
host = String
"" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Set the host to bind on (e.g., an ip address; '!4' for ipv4-only; '!6' for ipv6-only; default: '*' for any host)."
    ,https :: Bool
https = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Start an https server (use --cert and --key to specify paths to the .pem files)"
    ,cert :: String
cert = String
"cert.pem" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= Ann
typFile String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Path to the certificate pem file (when running an https server)"
    ,key :: String
key = String
"key.pem" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= Ann
typFile String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Path to the key pem file (when running an https server)"
    ,datadir :: Maybe String
datadir = Maybe String
forall a. Default a => a
def Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Override data directory paths"
    ,no_security_headers :: Bool
no_security_headers = Bool
False Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Don't send CSP security headers"
    } CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Start a Hoogle server"

replay :: CmdLine
replay = Replay :: String -> String -> Int -> Language -> String -> CmdLine
Replay
    {logs :: String
logs = String
"log.txt" String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= Ann
args String -> Ann -> String
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"FILE"
    } CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Replay a log file"

test :: CmdLine
test = Test :: Bool -> Bool -> String -> Language -> CmdLine
Test
    { deep :: Bool
deep    = Bool
False Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Run extra long tests"
    , disable_network_tests :: Bool
disable_network_tests = Bool
False  Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Disables the use of network tests"
    } CmdLine -> Ann -> CmdLine
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Run the test suite"