refactor: Commands
This commit is contained in:
parent
4ee39e039b
commit
b92aa4b89e
@ -1,5 +1,8 @@
|
|||||||
{-|
|
{-|
|
||||||
hledger's built-in commands, and helpers for printing the commands list.
|
hledger's built-in commands, and helpers for printing the commands list.
|
||||||
|
|
||||||
|
New built-in commands should be added in four places below:
|
||||||
|
the export list, the import list, builtinCommands, commandsList.
|
||||||
-}
|
-}
|
||||||
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
@ -79,8 +82,8 @@ import Hledger.Cli.Commands.Roi
|
|||||||
import Hledger.Cli.Commands.Stats
|
import Hledger.Cli.Commands.Stats
|
||||||
import Hledger.Cli.Commands.Tags
|
import Hledger.Cli.Commands.Tags
|
||||||
|
|
||||||
|
-- | The cmdargs subcommand mode (for command-line parsing)
|
||||||
-- | The cmdargs subcommand mode and IO action for each builtin command.
|
-- and IO action (for doing the command's work) for each builtin command.
|
||||||
-- Command actions take parsed CLI options and a (lazy) finalised journal.
|
-- Command actions take parsed CLI options and a (lazy) finalised journal.
|
||||||
builtinCommands :: [(Mode RawOpts, CliOpts -> Journal -> IO ())]
|
builtinCommands :: [(Mode RawOpts, CliOpts -> Journal -> IO ())]
|
||||||
builtinCommands = [
|
builtinCommands = [
|
||||||
@ -110,24 +113,23 @@ builtinCommands = [
|
|||||||
,(testmode , testcmd)
|
,(testmode , testcmd)
|
||||||
]
|
]
|
||||||
|
|
||||||
-- | All names and aliases of builtin commands.
|
-- | The commands list, showing command names, standard aliases,
|
||||||
builtinCommandNames :: [String]
|
-- and short descriptions. This has some dynamic features, as follows:
|
||||||
builtinCommandNames = concatMap (modeNames . fst) builtinCommands
|
--
|
||||||
|
|
||||||
-- | Look up a builtin command's mode and action by exact command name or alias.
|
|
||||||
findCommand :: String -> Maybe (Mode RawOpts, CliOpts -> Journal -> IO ())
|
|
||||||
findCommand cmdname = find (elem cmdname . modeNames . fst) builtinCommands
|
|
||||||
|
|
||||||
-- | A template for the commands list, containing entries (indented lines)
|
|
||||||
-- for all known and some hypothetical builtin and addon commands.
|
|
||||||
-- These will be filtered based on the commands found at runtime,
|
|
||||||
-- except those beginning with "hledger", which are not filtered.
|
|
||||||
-- PROGVERSION is replaced with the program name and version.
|
-- PROGVERSION is replaced with the program name and version.
|
||||||
-- OTHER is replaced with an entry for each unknown addon command found.
|
|
||||||
--
|
--
|
||||||
-- The command descriptions here should be kept synced with
|
-- Each indented line represents a command. There are three kinds:
|
||||||
-- each command's builtin help and with hledger manual's command list.
|
|
||||||
--
|
--
|
||||||
|
-- - builtin commands; these should be kept synced with the
|
||||||
|
-- above builtinCommands and their docs (Commands/\*.md).
|
||||||
|
--
|
||||||
|
-- - known addon commands; these lines will be suppressed if the addon
|
||||||
|
-- command is not found in $PATH at runtime.
|
||||||
|
--
|
||||||
|
-- - additional command examples beginning with "hledger".
|
||||||
|
--
|
||||||
|
-- OTHER is replaced with entries for any additional (unknown) addon
|
||||||
|
-- commands found in $PATH at runtime.
|
||||||
commandsList :: String
|
commandsList :: String
|
||||||
commandsList = [here|
|
commandsList = [here|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
@ -162,7 +164,7 @@ UIs:
|
|||||||
web start web ui
|
web start web ui
|
||||||
|
|
||||||
Generating data:
|
Generating data:
|
||||||
close generate balance-resetting transactions
|
close (equity) generate balance-resetting transactions
|
||||||
interest generate interest transactions
|
interest generate interest transactions
|
||||||
rewrite generate automated postings on matched transactions
|
rewrite generate automated postings on matched transactions
|
||||||
|
|
||||||
@ -188,6 +190,15 @@ Help:
|
|||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|]
|
|]
|
||||||
|
|
||||||
|
|
||||||
|
-- | All names and aliases of builtin commands.
|
||||||
|
builtinCommandNames :: [String]
|
||||||
|
builtinCommandNames = concatMap (modeNames . fst) builtinCommands
|
||||||
|
|
||||||
|
-- | Look up a builtin command's mode and action by exact command name or alias.
|
||||||
|
findCommand :: String -> Maybe (Mode RawOpts, CliOpts -> Journal -> IO ())
|
||||||
|
findCommand cmdname = find (elem cmdname . modeNames . fst) builtinCommands
|
||||||
|
|
||||||
-- | Print the commands list, modifying the template above based on
|
-- | Print the commands list, modifying the template above based on
|
||||||
-- the currently available addons. Missing addons will be removed, and
|
-- the currently available addons. Missing addons will be removed, and
|
||||||
-- extra addons will be added under Misc.
|
-- extra addons will be added under Misc.
|
||||||
@ -220,7 +231,7 @@ commandsFromCommandsList s =
|
|||||||
concatMap (splitOn "|") [w | ' ':l <- lines s, let w:_ = words l]
|
concatMap (splitOn "|") [w | ' ':l <- lines s, let w:_ = words l]
|
||||||
|
|
||||||
|
|
||||||
-- The test command, defined here for easy access to other modules' tests.
|
-- The test command is defined here for easy access to other modules' tests.
|
||||||
|
|
||||||
testmode = hledgerCommandMode
|
testmode = hledgerCommandMode
|
||||||
$(hereFileRelative "Hledger/Cli/Commands/Test.md")
|
$(hereFileRelative "Hledger/Cli/Commands/Test.md")
|
||||||
@ -229,10 +240,10 @@ testmode = hledgerCommandMode
|
|||||||
[]
|
[]
|
||||||
([], Just $ argsFlag "[TESTPATTERN] [SEED]")
|
([], Just $ argsFlag "[TESTPATTERN] [SEED]")
|
||||||
|
|
||||||
-- | See testmode.
|
-- | The test command.
|
||||||
--
|
-- Unlike most hledger commands, this one does not read the user's journal.
|
||||||
-- Unlike other hledger commands, this one does not operate on the user's Journal.
|
-- A 'Journal' argument remains in the type signature, but it should
|
||||||
-- For ease of implementation the Journal parameter remains in the type signature.
|
-- not be used (and would raise an error).
|
||||||
testcmd :: CliOpts -> Journal -> IO ()
|
testcmd :: CliOpts -> Journal -> IO ()
|
||||||
testcmd opts _undefined = do
|
testcmd opts _undefined = do
|
||||||
let args = words' $ query_ $ reportopts_ opts
|
let args = words' $ query_ $ reportopts_ opts
|
||||||
@ -243,6 +254,7 @@ testcmd opts _undefined = do
|
|||||||
e <- runEasytests args $ EasyTest.tests [tests_Hledger, tests_Commands]
|
e <- runEasytests args $ EasyTest.tests [tests_Hledger, tests_Commands]
|
||||||
if e then exitFailure else exitSuccess
|
if e then exitFailure else exitSuccess
|
||||||
|
|
||||||
|
|
||||||
-- unit tests of hledger command-line executable
|
-- unit tests of hledger command-line executable
|
||||||
|
|
||||||
tests_Commands = tests "Commands" [
|
tests_Commands = tests "Commands" [
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user