updateReportSpecFromOpts -> updateReportSpec[With]
This commit is contained in:
parent
15dc638a07
commit
349ffd7c0b
@ -18,7 +18,8 @@ module Hledger.Reports.ReportOptions (
|
||||
rawOptsToReportOpts,
|
||||
defreportspec,
|
||||
reportOptsToSpec,
|
||||
updateReportSpecFromOpts,
|
||||
updateReportSpec,
|
||||
updateReportSpecWith,
|
||||
rawOptsToReportSpec,
|
||||
flat_,
|
||||
tree_,
|
||||
@ -245,12 +246,16 @@ reportOptsToSpec day ropts = do
|
||||
, rsQueryOpts = queryopts
|
||||
}
|
||||
|
||||
-- | Regenerate a ReportSpec after updating ReportOpts, or return an error
|
||||
-- message if there is a problem such as missing or unparseable options data.
|
||||
-- This helps keep the ReportSpec, its underlying ReportOpts, and the ReportOpts'
|
||||
-- data fields like querystring_ all in sync.
|
||||
updateReportSpecFromOpts :: (ReportOpts -> ReportOpts) -> ReportSpec -> Either String ReportSpec
|
||||
updateReportSpecFromOpts f rspec = reportOptsToSpec (rsToday rspec) . f $ rsOpts rspec
|
||||
-- | Update the ReportOpts and the fields derived from it in a ReportSpec,
|
||||
-- or return an error message if there is a problem such as missing or
|
||||
-- unparseable options data. This is the safe way to change a ReportSpec,
|
||||
-- ensuring that all fields (rsQuery, rsOpts, querystring_, etc.) are in sync.
|
||||
updateReportSpec :: ReportOpts -> ReportSpec -> Either String ReportSpec
|
||||
updateReportSpec ropts rspec = reportOptsToSpec (rsToday rspec) ropts
|
||||
|
||||
-- | Like updateReportSpec, but takes a ReportOpts-modifying function.
|
||||
updateReportSpecWith :: (ReportOpts -> ReportOpts) -> ReportSpec -> Either String ReportSpec
|
||||
updateReportSpecWith f rspec = reportOptsToSpec (rsToday rspec) . f $ rsOpts rspec
|
||||
|
||||
-- | Generate a ReportSpec from RawOpts and the current date.
|
||||
rawOptsToReportSpec :: RawOpts -> IO ReportSpec
|
||||
|
||||
@ -55,7 +55,7 @@ uiShowStatus copts ss =
|
||||
reportSpecToggleStatusSomehow :: Status -> CliOpts -> ReportSpec -> ReportSpec
|
||||
reportSpecToggleStatusSomehow s copts =
|
||||
either (error "reportSpecToggleStatusSomehow: updating Status should not result in an error") id -- PARTIAL:
|
||||
. updateReportSpecFromOpts update
|
||||
. updateReportSpecWith update
|
||||
where
|
||||
update = case maybeposintopt "status-toggles" $ rawopts_ copts of
|
||||
Just 2 -> reportOptsToggleStatus2 s
|
||||
@ -189,7 +189,7 @@ toggleReal ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportspec_=rspe
|
||||
ui{aopts=uopts{cliopts_=copts{reportspec_=update rspec}}}
|
||||
where
|
||||
update = either (error "toggleReal: updating Real should not result in an error") id -- PARTIAL:
|
||||
. updateReportSpecFromOpts (\ropts -> ropts{real_=not $ real_ ropts})
|
||||
. updateReportSpecWith (\ropts -> ropts{real_=not $ real_ ropts})
|
||||
|
||||
-- | Toggle the ignoring of balance assertions.
|
||||
toggleIgnoreBalanceAssertions :: UIState -> UIState
|
||||
@ -237,14 +237,14 @@ updateReportPeriod updatePeriod ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@Cli
|
||||
ui{aopts=uopts{cliopts_=copts{reportspec_=update rspec}}}
|
||||
where
|
||||
update = either (error "updateReportPeriod: updating period should not result in an error") id -- PARTIAL:
|
||||
. updateReportSpecFromOpts (\ropts -> ropts{period_=updatePeriod $ period_ ropts})
|
||||
. updateReportSpecWith (\ropts -> ropts{period_=updatePeriod $ period_ ropts})
|
||||
|
||||
-- | Apply a new filter query.
|
||||
setFilter :: String -> UIState -> UIState
|
||||
setFilter s ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportspec_=rspec}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportspec_=update rspec}}}
|
||||
where
|
||||
update = either (const rspec) id . updateReportSpecFromOpts (\ropts -> ropts{querystring_=querystring})
|
||||
update = either (const rspec) id . updateReportSpecWith (\ropts -> ropts{querystring_=querystring})
|
||||
querystring = words'' prefixes $ T.pack s
|
||||
|
||||
-- | Reset some filters & toggles.
|
||||
@ -303,7 +303,7 @@ updateReportDepth updateDepth ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOp
|
||||
ui{aopts=uopts{cliopts_=copts{reportspec_=update rspec}}}
|
||||
where
|
||||
update = either (error "updateReportDepth: updating depth should not result in an error") id -- PARTIAL:
|
||||
. updateReportSpecFromOpts (\ropts -> ropts{depth_=updateDepth (depth_ ropts) >>= clipDepth ropts})
|
||||
. updateReportSpecWith (\ropts -> ropts{depth_=updateDepth (depth_ ropts) >>= clipDepth ropts})
|
||||
clipDepth ropts d | d < 0 = depth_ ropts
|
||||
| d >= maxDepth ui = Nothing
|
||||
| otherwise = Just d
|
||||
|
||||
@ -33,7 +33,7 @@ check copts@CliOpts{rawopts_} j = do
|
||||
args = listofstringopt "args" rawopts_
|
||||
-- reset the report spec that was generated by argsToCliOpts,
|
||||
-- since we are not using arguments as a query in the usual way
|
||||
copts' = cliOptsUpdateReportSpec (\ropts -> ropts{querystring_=[]}) copts
|
||||
copts' = cliOptsUpdateReportSpecWith (\ropts -> ropts{querystring_=[]}) copts
|
||||
|
||||
case partitionEithers (map parseCheckArgument args) of
|
||||
(unknowns@(_:_), _) -> error' $ "These checks are unknown: "++unwords unknowns
|
||||
@ -81,8 +81,8 @@ runCheck copts@CliOpts{rawopts_} j (check,args) =
|
||||
-- underlying report options with the given update function.
|
||||
-- This can raise an error if there is a problem eg due to missing or
|
||||
-- unparseable options data. See also updateReportSpecFromOpts.
|
||||
cliOptsUpdateReportSpec :: (ReportOpts -> ReportOpts) -> CliOpts -> CliOpts
|
||||
cliOptsUpdateReportSpec roptsupdate copts@CliOpts{reportspec_} =
|
||||
case updateReportSpecFromOpts roptsupdate reportspec_ of
|
||||
cliOptsUpdateReportSpecWith :: (ReportOpts -> ReportOpts) -> CliOpts -> CliOpts
|
||||
cliOptsUpdateReportSpecWith roptsupdate copts@CliOpts{reportspec_} =
|
||||
case updateReportSpecWith roptsupdate reportspec_ of
|
||||
Left e -> error' e -- PARTIAL:
|
||||
Right rs -> copts{reportspec_=rs}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user