mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
cli: make argument-less --debug more robust
This commit is contained in:
parent
baeca07440
commit
7aab544cf6
@ -95,7 +95,7 @@ helpflags :: [Flag RawOpts]
|
||||
helpflags = [
|
||||
flagNone ["help","h"] (setboolopt "help") "show general help or (after command) command help"
|
||||
-- ,flagNone ["browse-args"] (setboolopt "browse-args") "use a web UI to select options and build up a command line"
|
||||
,flagReq ["debug"] (\s opts -> Right $ setopt "debug" s opts) "N" "show debug output if N is 1-9 (default: 0)"
|
||||
,flagReq ["debug"] (\s opts -> Right $ setopt "debug" s opts) "N" "show increasing amounts of debug output if N is 1-9. With no argument, show level 1"
|
||||
,flagNone ["version"] (setboolopt "version") "show version information"
|
||||
]
|
||||
|
||||
|
@ -157,26 +157,38 @@ argsToCliOpts args addons = do
|
||||
-- - move all required-argument help and input flags along with their values, space-separated or not
|
||||
-- - not confuse things further or cause misleading errors.
|
||||
moveFlagsAfterCommand :: [String] -> [String]
|
||||
moveFlagsAfterCommand args = move args
|
||||
moveFlagsAfterCommand args = moveArgs $ ensureDebugHasArg args
|
||||
where
|
||||
move (f:a:as) | isMovableNoArgFlag f = (move $ a:as) ++ [f]
|
||||
move (f:v:a:as) | isMovableReqArgFlag f = (move $ a:as) ++ [f,v]
|
||||
move (fv:a:as) | isMovableReqArgFlagAndValue fv = (move $ a:as) ++ [fv]
|
||||
move ("--debug":v:a:as) | not (null v) && all isDigit v = (move $ a:as) ++ ["--debug",v]
|
||||
move ("--debug":a:as) = (move $ a:as) ++ ["--debug"]
|
||||
move (fv@('-':'-':'d':'e':'b':'u':'g':'=':_):a:as) = (move $ a:as) ++ [fv]
|
||||
move as = as
|
||||
-- quickly! make sure --debug has a numeric argument, or this all goes to hell
|
||||
ensureDebugHasArg as =
|
||||
case break (=="--debug") as of
|
||||
(bs,"--debug":c:cs) | null c || not (all isDigit c) -> bs++"--debug=1":c:cs
|
||||
(bs,"--debug":[]) -> bs++"--debug=1":[]
|
||||
_ -> as
|
||||
|
||||
isMovableNoArgFlag a = "-" `isPrefixOf` a && dropWhile (=='-') a `elem` noargflagstomove
|
||||
isMovableReqArgFlag a = "-" `isPrefixOf` a && dropWhile (=='-') a `elem` reqargflagstomove
|
||||
isMovableReqArgFlagAndValue ('-':'-':a:as) = case break (== '=') (a:as) of (f:fs,_) -> (f:fs) `elem` reqargflagstomove
|
||||
_ -> False
|
||||
isMovableReqArgFlagAndValue ('-':f:_:_) = [f] `elem` reqargflagstomove
|
||||
isMovableReqArgFlagAndValue _ = False
|
||||
-- -h ..., --version ...
|
||||
moveArgs (f:a:as) | isMovableNoArgFlag f = (moveArgs $ a:as) ++ [f]
|
||||
-- -f FILE ..., --alias ALIAS ...
|
||||
moveArgs (f:v:a:as) | isMovableReqArgFlag f
|
||||
, not (take 1 v == "-") = (moveArgs $ a:as) ++ [f,v]
|
||||
-- -fFILE ..., --alias=ALIAS ...
|
||||
moveArgs (fv:a:as) | isMovableReqArgFlagAndValue fv = (moveArgs $ a:as) ++ [fv]
|
||||
-- anything else
|
||||
moveArgs as = as
|
||||
|
||||
noargflagstomove = concatMap flagNames $ filter ((==FlagNone).flagInfo) flagstomove
|
||||
reqargflagstomove = concatMap flagNames $ filter ((==FlagReq ).flagInfo) flagstomove
|
||||
flagstomove = inputflags ++ helpflags
|
||||
isMovableNoArgFlag a = "-" `isPrefixOf` a && dropWhile (=='-') a `elem` noargflagstomove
|
||||
|
||||
isMovableReqArgFlag a = "-" `isPrefixOf` a && dropWhile (=='-') a `elem` reqargflagstomove
|
||||
|
||||
isMovableReqArgFlagAndValue ('-':'-':a:as) = case break (== '=') (a:as) of (f:fs,_:_) -> (f:fs) `elem` reqargflagstomove
|
||||
_ -> False
|
||||
isMovableReqArgFlagAndValue ('-':shortflag:_:_) = [shortflag] `elem` reqargflagstomove
|
||||
isMovableReqArgFlagAndValue _ = False
|
||||
|
||||
flagstomove = inputflags ++ helpflags
|
||||
noargflagstomove = concatMap flagNames $ filter ((==FlagNone).flagInfo) flagstomove
|
||||
reqargflagstomove = -- filter (/= "debug") $
|
||||
concatMap flagNames $ filter ((==FlagReq ).flagInfo) flagstomove
|
||||
|
||||
-- | Let's go.
|
||||
main :: IO ()
|
||||
|
Loading…
Reference in New Issue
Block a user