[beast: 4/9] BSE: bsetool: add CommandRegistry to simplify adding and registering new commands
- From: Tim Janik <timj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [beast: 4/9] BSE: bsetool: add CommandRegistry to simplify adding and registering new commands
- Date: Wed, 23 Sep 2015 09:06:48 +0000 (UTC)
commit 8c10cb64f2157a14233db3a0dba458fd789253ab
Author: Tim Janik <timj gnu org>
Date: Thu Sep 17 18:29:44 2015 +0200
BSE: bsetool: add CommandRegistry to simplify adding and registering new commands
bse/bsetool.cc | 133 +++++++++++++++++++++++++-------------------------------
1 files changed, 59 insertions(+), 74 deletions(-)
---
diff --git a/bse/bsetool.cc b/bse/bsetool.cc
index 8a30afe..3e8837e 100644
--- a/bse/bsetool.cc
+++ b/bse/bsetool.cc
@@ -118,6 +118,32 @@ ArgParser::parse_args (const uint argc, char *const argv[])
return ""; // success
}
+// == CommandRegistry ==
+class CommandRegistry;
+static CommandRegistry *command_registry_chain = NULL;
+class CommandRegistry {
+ ArgParser arg_parser_;
+ String (*cmd_) (const ArgParser&);
+ String name_;
+ CommandRegistry *next_;
+public:
+ template<size_t N>
+ explicit CommandRegistry (ArgDescription (&adescs) [N], String (*cmd) (const ArgParser&), const String
&name) :
+ arg_parser_ (adescs), cmd_ (cmd), name_ (name), next_ (command_registry_chain)
+ {
+ command_registry_chain = this;
+ }
+ ~CommandRegistry()
+ {
+ command_registry_chain = NULL;
+ }
+ CommandRegistry* next () { return next_; }
+ String name () { return name_; }
+ String run () { return cmd_ (arg_parser_); }
+ String parse_args (const uint argc, char *const argv[]) { return arg_parser_.parse_args (argc,
argv); }
+};
+
+
// == crawl ==
static ArgDescription crawl_options[] = {
{ "<glob>", "", "Glob pattern to list matching files", "" },
@@ -138,6 +164,8 @@ crawl (const ArgParser &ap)
return "";
}
+static CommandRegistry crawl_cmd (crawl_options, crawl, "crawl");
+
// == dump-info ==
static ArgDescription dump_info_options[] = {
{ "", "", "", "" }, // dummy, no options currently
@@ -213,6 +241,9 @@ dump_info (const ArgParser &ap)
return "";
}
+static CommandRegistry dump_info_cmd (dump_info_options, dump_info, "dump-info");
+
+
// == render2wav ==
static ArgDescription render2wav_options[] = {
{ "-s, --seconds", "<seconds>", "Number of seconds to record", "0" },
@@ -220,7 +251,7 @@ static ArgDescription render2wav_options[] = {
{ "<wav-file>", "", "The WAV file to use for audio output", "" },
};
-static ErrorType
+static String
render2wav (const ArgParser &ap)
{
const String bsefile = ap["bse-file"];
@@ -230,7 +261,7 @@ render2wav (const ArgParser &ap)
project->auto_deactivate (0);
auto err = project->restore_from_file (bsefile);
if (err)
- return err;
+ return bse_error_blurb (err);
BSE_SERVER.start_recording (wavfile, n_seconds);
err = project->play();
printq ("Recording %s to %s...\n", bsefile, wavfile);
@@ -250,9 +281,12 @@ render2wav (const ArgParser &ap)
}
printq ("\n");
- return ERROR_NONE;
+ return "";
}
+static CommandRegistry render2wav_cmd (render2wav_options, render2wav, "render2wav");
+
+
// == check-load ==
static ArgDescription check_load_options[] = {
{ "<bse-file>", "", "The BSE file to load and check for validity", "" },
@@ -271,6 +305,9 @@ check_load (const ArgParser &ap)
return "";
}
+static CommandRegistry check_load_cmd (check_load_options, check_load, "check-load");
+
+
// == bse tool ==
static ArgDescription bsetool_options[] = {
{ "--bse-no-load", "", "Prevent automated plugin and script registration", "" },
@@ -304,77 +341,25 @@ main (int argc_int, char *argv[])
g_main_context_iteration (bse_main_context, false);
}
// command parsing
- if (option_argc < argc && argv[option_argc] == String ("render2wav"))
- {
- ArgParser ap (render2wav_options);
- String error = ap.parse_args (argc - option_argc - 1, argv + option_argc + 1);
- if (!error.empty())
- {
- printerr ("%s: render2wav: %s\n", argv[0], error);
- return 127;
- }
- ErrorType err = render2wav (ap);
- if (err != ERROR_NONE)
- {
- printerr ("%s: render2wav: %s\n", argv[0], bse_error_blurb (err));
- return 127;
- }
- return 0; // success
- }
- else if (option_argc < argc && argv[option_argc] == String ("check-load"))
- {
- ArgParser ap (check_load_options);
- String error = ap.parse_args (argc - option_argc - 1, argv + option_argc + 1);
- if (!error.empty())
- {
- printerr ("%s: check-load: %s\n", argv[0], error);
- return 127;
- }
- error = check_load (ap);
- if (!error.empty())
- {
- printerr ("check-load: %s\n", error);
- return 127;
- }
- return 0; // success
- }
- else if (option_argc < argc && argv[option_argc] == String ("dump-info"))
- {
- ArgParser ap (dump_info_options);
- String error = ap.parse_args (argc - option_argc - 1, argv + option_argc + 1);
- if (!error.empty())
- {
- printerr ("%s: dump-info: %s\n", argv[0], error);
- return 127;
- }
- error = dump_info (ap);
- if (!error.empty())
- {
- printerr ("dump-info: %s\n", error);
- return 127;
- }
- return 0; // success
- }
- else if (option_argc < argc && argv[option_argc] == String ("crawl"))
- {
- ArgParser ap (crawl_options);
- String error = ap.parse_args (argc - option_argc - 1, argv + option_argc + 1);
- if (!error.empty())
+ if (option_argc < argc)
+ for (CommandRegistry *cmd = command_registry_chain; cmd; cmd = cmd->next())
+ if (cmd->name() == argv[option_argc])
{
- printerr ("%s: crawl: %s\n", argv[0], error);
- return 127;
- }
- error = crawl (ap);
- if (!error.empty())
- {
- printerr ("crawl: %s\n", error);
- return 127;
+ String error = cmd->parse_args (argc - option_argc - 1, argv + option_argc + 1);
+ if (!error.empty())
+ {
+ printerr ("%s: %s: %s\n", argv[0], cmd->name(), error);
+ return 127;
+ }
+ error = cmd->run();
+ if (!error.empty())
+ {
+ printerr ("%s: %s\n", cmd->name(), error);
+ return 127;
+ }
+ return 0; // success
}
- return 0; // success
- }
- else
- {
- printerr ("%s: %s\n", argv[0], "missing command");
- return 127;
- }
+
+ printerr ("%s: %s\n", argv[0], "missing command");
+ return 127;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]