Skip to content

Commit e5d40ad

Browse files
committed
Rework parsing of database flag: make it properly optional
1 parent 9493521 commit e5d40ad

1 file changed

Lines changed: 30 additions & 52 deletions

File tree

src/Action/CmdLine.hs

Lines changed: 30 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
{-# LANGUAGE RecordWildCards #-}
22
{-# LANGUAGE DuplicateRecordFields #-}
3-
{-# LANGUAGE OverloadedRecordDot #-}
43
{-# LANGUAGE ApplicativeDo #-}
54

65
module Action.CmdLine(
@@ -21,13 +20,11 @@ module Action.CmdLine(
2120
whenLoud, whenNormal
2221
) where
2322

24-
import Data.List.Extra
2523
import Data.Version
2624
import General.Util
2725
import Paths_hoogle (version)
2826
import Options.Applicative as O
2927
import System.Directory
30-
import System.Environment
3128
import System.FilePath
3229
import System.IO
3330
import Control.Monad
@@ -40,7 +37,6 @@ whenLoud, whenNormal :: Verbosity -> IO () -> IO ()
4037
whenLoud v k = when (v >= VerbosityLoud) k
4138
whenNormal v k = when (v >= VerbosityNormal) k
4239

43-
4440
data SearchOpts
4541
= SearchOpts
4642
{ color :: Maybe Bool
@@ -139,49 +135,31 @@ defaultDatabaseLang = do
139135
pure legacyLocation
140136
pure $ dir </> "default-haskell-" ++ showVersion (trimVersion 3 version) ++ ".hoo"
141137

142-
-- N.B. This is rather awkward but seems to be the pragmatic way to migrate
143-
-- away from cmdargs without changing the user-visible command-line syntax.
144-
fillInDatabase :: FilePath -> Mode -> Mode
145-
fillInDatabase defDb (Search opts)
146-
| "" <- opts.database = Search $ opts { database = defDb }
147-
fillInDatabase defDb (Generate opts)
148-
| "" <- opts.database = Generate $ opts { database = defDb }
149-
fillInDatabase defDb (Server opts)
150-
| "" <- opts.database = Server $ opts { database = defDb }
151-
fillInDatabase defDb (Replay opts)
152-
| "" <- opts.database = Replay $ opts { database = defDb }
153-
fillInDatabase defDb (Test opts)
154-
| "" <- opts.database = Test $ opts { database = defDb }
155-
fillInDatabase _ mode = mode
156-
157138
getCmdLine :: [String] -> IO (Verbosity, Mode)
158139
getCmdLine args = do
159-
(verbosity, mode) <- execParser cmdline
160-
161-
-- fill in the default database TODO
162-
--args <- if args.database /= "" then pure args else do
163140
defDb <- defaultDatabaseLang
164-
pure (verbosity, fillInDatabase defDb mode)
141+
(verbosity, mode) <- execParser (cmdline defDb)
142+
pure (verbosity, mode)
165143

166-
cmdline :: ParserInfo (Verbosity, Mode)
167-
cmdline =
144+
cmdline :: FilePath -> ParserInfo (Verbosity, Mode)
145+
cmdline defDb =
168146
O.info ((,) <$> verbosity <*> mode' <**> helper <**> simpleVersioner (showVersion version)) (header name)
169147
where
170-
mode' = mode <|> fmap Search searchOpts
148+
mode' = mode defDb <|> fmap Search (searchOpts defDb)
171149
verbosity = flag VerbosityNormal VerbosityLoud (short 'v' <> long "verbose" <> help "emit verbose output")
172150
name = "Hoogle " ++ showVersion version ++ ", https://hoogle.haskell.org/"
173151

174-
mode :: Parser Mode
175-
mode = hsubparser
176-
$ command "search" (O.info (Search <$> searchOpts) (progDesc "Perform a search"))
177-
<> command "generate" (O.info (Generate <$> generateOpts) (progDesc "Generate Hoogle databases"))
178-
<> command "serve" (O.info (Server <$> serverOpts) (progDesc "Start a Hoogle server"))
179-
<> command "replay" (O.info (Replay <$> replayOpts) (progDesc "Replay a log file"))
180-
<> command "test" (O.info (Test <$> testOpts) (progDesc "Run the test suite"))
152+
mode :: FilePath -> Parser Mode
153+
mode defDb = hsubparser
154+
$ command "search" (O.info (Search <$> searchOpts defDb) (progDesc "Perform a search"))
155+
<> command "generate" (O.info (Generate <$> generateOpts defDb) (progDesc "Generate Hoogle databases"))
156+
<> command "serve" (O.info (Server <$> serverOpts defDb) (progDesc "Start a Hoogle server"))
157+
<> command "replay" (O.info (Replay <$> replayOpts defDb) (progDesc "Replay a log file"))
158+
<> command "test" (O.info (Test <$> testOpts defDb) (progDesc "Run the test suite"))
181159

182-
databaseFlag :: Parser FilePath
183-
databaseFlag =
184-
option str (long "database" <> short 'd' <> metavar "FILE" <> help "Name of database to use (use .hoo extension)")
160+
databaseFlag :: FilePath -> Parser FilePath
161+
databaseFlag defDb =
162+
option str (long "database" <> short 'd' <> metavar "FILE" <> help "Name of database to use (use .hoo extension)" <> value defDb <> showDefault)
185163

186164
logsFlag :: Parser FilePath
187165
logsFlag =
@@ -195,25 +173,25 @@ scopeFlag :: Parser String
195173
scopeFlag =
196174
option str (long "scope" <> short 's' <> help "Default scope to start with")
197175

198-
searchOpts :: Parser SearchOpts
199-
searchOpts = do
176+
searchOpts :: FilePath -> Parser SearchOpts
177+
searchOpts defDb = do
200178
color <- optional $ switch (long "colour" <> help "Use colored output (requires ANSI terminal)")
201179
json <- switch (long "json" <> help "Get result as JSON")
202180
jsonl <- switch (long "jsonl" <> help "Get result as JSONL (JSON Lines)")
203181
link <- switch (long "link" <> help "Give URL's for each result")
204182
numbers <- switch (long "numbers" <> help "Give counter for each result")
205183
info <- switch (long "info" <> help "Give extended information about the first n results (set n with --count, default is 1)")
206-
database <- databaseFlag
184+
database <- databaseFlag defDb
207185
count <- optional $ option auto (short 'n' <> long "count" <> help "Maximum number of results to return (defaults to 10)")
208186
query <- some $ argument str (metavar "QUERY")
209187
repeat_ <- repeatFlag
210188
compare_ <- many $ option str (long "compare" <> metavar "SIG" <> help "Type signatures to compare against")
211189
pure $ SearchOpts {..}
212190

213-
generateOpts :: Parser GenerateOpts
214-
generateOpts = do
191+
generateOpts :: FilePath -> Parser GenerateOpts
192+
generateOpts defDb = do
215193
download <- optional $ switch (long "download" <> help "Download all files from the web")
216-
database <- databaseFlag
194+
database <- databaseFlag defDb
217195
insecure <- switch (long "insecure" <> short 'i' <> help "Allow insecure HTTPS connections")
218196
include <- many $ argument str (metavar "PACKAGE" <> help "Packages to include")
219197
local_ <- many $ option (fromMaybe "" <$> optional str) (long "local" <> short 'l' <> help "Index local packages and link to local haddock docs")
@@ -233,10 +211,10 @@ tcpEndpoint =
233211
host = option str (long "host" <> value "*" <> help "Set the host to bind on (e.g., an ip address; '!4' for ipv4-only; '!6' for ipv6-only; default: '*' for any host).")
234212
port = option auto (long "port" <> short 'p' <> value 8080 <> metavar "PORT" <> help "Port number")
235213

236-
serverOpts :: Parser ServerOpts
237-
serverOpts = do
214+
serverOpts :: FilePath -> Parser ServerOpts
215+
serverOpts defDb = do
238216
endpoint <- unixEndpoint <|> tcpEndpoint
239-
database <- databaseFlag
217+
database <- databaseFlag defDb
240218
cdn <- option str (value "" <> metavar "URL" <> help "URL prefix to use")
241219
logs <- logsFlag
242220
local <- switch (long "local" <> help "Allow following file:// links, restricts to 127.0.0.1 Set --host explicitely (including to '*' for any host) to override the localhost-only behaviour")
@@ -251,17 +229,17 @@ serverOpts = do
251229
no_security_headers <- switch (long "no-security-headers" <> short 'n' <> help "Don't send CSP security headers")
252230
pure ServerOpts {..}
253231

254-
replayOpts :: Parser ReplayOpts
255-
replayOpts = do
232+
replayOpts :: FilePath -> Parser ReplayOpts
233+
replayOpts defDb = do
256234
logs <- logsFlag
257-
database <- databaseFlag
235+
database <- databaseFlag defDb
258236
repeat_ <- repeatFlag
259237
scope <- scopeFlag
260238
pure ReplayOpts {..}
261239

262-
testOpts :: Parser TestOpts
263-
testOpts = do
240+
testOpts :: FilePath -> Parser TestOpts
241+
testOpts defDb = do
264242
deep <- switch (long "deep" <> help "Run extra long tests")
265-
database <- databaseFlag
243+
database <- databaseFlag defDb
266244
disable_network_tests <- switch (long "disable-network-tests" <> help "Disables the use of network tests")
267245
pure TestOpts {..}

0 commit comments

Comments
 (0)