lib, cli: -U/-P/-C flags can be combined (#564)

This commit is contained in:
Simon Michael 2017-06-10 13:30:48 -07:00
parent 44c6b324ab
commit 7fc921db86
4 changed files with 28 additions and 29 deletions

View File

@ -34,6 +34,7 @@ import Data.Data (Data)
#if !MIN_VERSION_base(4,8,0) #if !MIN_VERSION_base(4,8,0)
import Data.Functor.Compat ((<$>)) import Data.Functor.Compat ((<$>))
#endif #endif
import Data.List
import Data.Maybe import Data.Maybe
import qualified Data.Text as T import qualified Data.Text as T
import Data.Typeable (Typeable) import Data.Typeable (Typeable)
@ -73,7 +74,7 @@ instance Default AccountListMode where def = ALDefault
data ReportOpts = ReportOpts { data ReportOpts = ReportOpts {
period_ :: Period period_ :: Period
,interval_ :: Interval ,interval_ :: Interval
,clearedstatus_ :: Maybe ClearedStatus ,clearedstatus_ :: [ClearedStatus] -- ^ Zero, one, or two statuses to be matched
,cost_ :: Bool ,cost_ :: Bool
,depth_ :: Maybe Int ,depth_ :: Maybe Int
,display_ :: Maybe DisplayExp ,display_ :: Maybe DisplayExp
@ -262,16 +263,18 @@ intervalFromRawOpts = lastDef NoInterval . catMaybes . map intervalfromrawopt
| n == "yearly" = Just $ Years 1 | n == "yearly" = Just $ Years 1
| otherwise = Nothing | otherwise = Nothing
-- | Get the cleared status, if any, specified by the last of -C/--cleared, -- | Get any cleared statuses to be matched, as specified by -C/--cleared,
-- --pending, -U/--uncleared options. -- -P/--pending, -U/--uncleared options. -UPC is equivalent to no flags,
clearedStatusFromRawOpts :: RawOpts -> Maybe ClearedStatus -- so this returns a list of 0-2 unique statuses.
clearedStatusFromRawOpts = lastMay . catMaybes . map clearedstatusfromrawopt clearedStatusFromRawOpts :: RawOpts -> [ClearedStatus]
clearedStatusFromRawOpts = simplify . nub . sort . catMaybes . map clearedstatusfromrawopt
where where
clearedstatusfromrawopt (n,_) clearedstatusfromrawopt (n,_)
| n == "cleared" = Just Cleared | n == "cleared" = Just Cleared
| n == "pending" = Just Pending | n == "pending" = Just Pending
| n == "uncleared" = Just Uncleared | n == "uncleared" = Just Uncleared
| otherwise = Nothing | otherwise = Nothing
simplify l = if length l == 3 then [] else l -- TODO: (maxBound :: ClearedStatus) or something
type DisplayExp = String type DisplayExp = String
@ -319,7 +322,7 @@ queryFromOpts d ReportOpts{..} = simplifyQuery $ And $ [flagsq, argsq]
[(if date2_ then Date2 else Date) $ periodAsDateSpan period_] [(if date2_ then Date2 else Date) $ periodAsDateSpan period_]
++ (if real_ then [Real True] else []) ++ (if real_ then [Real True] else [])
++ (if empty_ then [Empty True] else []) -- ? ++ (if empty_ then [Empty True] else []) -- ?
++ (maybe [] ((:[]) . Status) clearedstatus_) ++ [Or $ map Status clearedstatus_]
++ (maybe [] ((:[]) . Depth) depth_) ++ (maybe [] ((:[]) . Depth) depth_)
argsq = fst $ parseQuery d (T.pack query_) argsq = fst $ parseQuery d (T.pack query_)
@ -331,7 +334,7 @@ queryFromOptsOnly _d ReportOpts{..} = simplifyQuery flagsq
[(if date2_ then Date2 else Date) $ periodAsDateSpan period_] [(if date2_ then Date2 else Date) $ periodAsDateSpan period_]
++ (if real_ then [Real True] else []) ++ (if real_ then [Real True] else [])
++ (if empty_ then [Empty True] else []) -- ? ++ (if empty_ then [Empty True] else []) -- ?
++ (maybe [] ((:[]) . Status) clearedstatus_) ++ [Or $ map Status clearedstatus_]
++ (maybe [] ((:[]) . Depth) depth_) ++ (maybe [] ((:[]) . Depth) depth_)
tests_queryFromOpts :: [Test] tests_queryFromOpts :: [Test]

View File

@ -20,26 +20,21 @@ import Hledger.UI.UIOptions
-- | Toggle between showing only cleared items or all items. -- | Toggle between showing only cleared items or all items.
toggleCleared :: UIState -> UIState toggleCleared :: UIState -> UIState
toggleCleared ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} = toggleCleared ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
ui{aopts=uopts{cliopts_=copts{reportopts_=toggleCleared ropts}}} ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatus Cleared ropts}}}
where
toggleCleared ropts@ReportOpts{clearedstatus_=Just Cleared} = ropts{clearedstatus_=Nothing}
toggleCleared ropts = ropts{clearedstatus_=Just Cleared}
-- | Toggle between showing only pending items or all items. -- | Toggle between showing only pending items or all items.
togglePending :: UIState -> UIState togglePending :: UIState -> UIState
togglePending ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} = togglePending ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
ui{aopts=uopts{cliopts_=copts{reportopts_=togglePending ropts}}} ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatus Pending ropts}}}
where
togglePending ropts@ReportOpts{clearedstatus_=Just Pending} = ropts{clearedstatus_=Nothing}
togglePending ropts = ropts{clearedstatus_=Just Pending}
-- | Toggle between showing only uncleared items or all items. -- | Toggle between showing only uncleared items or all items.
toggleUncleared :: UIState -> UIState toggleUncleared :: UIState -> UIState
toggleUncleared ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} = toggleUncleared ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
ui{aopts=uopts{cliopts_=copts{reportopts_=toggleUncleared ropts}}} ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatus Uncleared ropts}}}
where
toggleUncleared ropts@ReportOpts{clearedstatus_=Just Uncleared} = ropts{clearedstatus_=Nothing} reportOptsToggleStatus s ropts
toggleUncleared ropts = ropts{clearedstatus_=Just Uncleared} | clearedstatus_ ropts == [s] = ropts{clearedstatus_=[]}
| otherwise = ropts{clearedstatus_=[s]}
-- | Toggle between showing all and showing only nonempty (more precisely, nonzero) items. -- | Toggle between showing all and showing only nonempty (more precisely, nonzero) items.
toggleEmpty :: UIState -> UIState toggleEmpty :: UIState -> UIState
@ -125,7 +120,7 @@ resetFilter ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=rop
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{ ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{
accountlistmode_=ALTree accountlistmode_=ALTree
,empty_=True ,empty_=True
,clearedstatus_=Nothing ,clearedstatus_=[]
,real_=False ,real_=False
,query_="" ,query_=""
--,period_=PeriodAll --,period_=PeriodAll

View File

@ -28,12 +28,11 @@ runHelp = runCommand "hledger-ui --help | less" >>= waitForProcess
-- ui -- ui
uiShowClearedStatus mc = uiShowClearedStatus = map showstatus
case mc of where
Just Cleared -> ["cleared"] showstatus Cleared = "cleared"
Just Pending -> ["pending"] showstatus Pending = "pending"
Just Uncleared -> ["uncleared"] showstatus Uncleared = "uncleared"
Nothing -> []
-- | Draw the help dialog, called when help mode is active. -- | Draw the help dialog, called when help mode is active.
helpDialog :: Widget Name helpDialog :: Widget Name

View File

@ -55,11 +55,13 @@ hledger -fstatus.journal print --uncleared
>>>=0 >>>=0
# 6. only one of these flags (the last) takes effect # 6. these flags can be combined
hledger -fstatus.journal register --uncleared --pending --cleared hledger -fstatus.journal register --uncleared --pending
>>> >>>
2017/01/03 cleared (a) 1 1 2017/01/01 uncleared (a) 1 1
(b) 1 2 (b) 1 2
2017/01/02 pending (a) 1 3
(b) 1 4
>>>= 0 >>>= 0
# 7. these flags work with other commands # 7. these flags work with other commands