refactor: simplify argument parsing code

This commit is contained in:
Yat Ho 2024-04-12 11:51:05 +08:00 committed by Charles Kerr
parent 023aa9c898
commit c3d686c78f
1 changed files with 54 additions and 90 deletions

View File

@ -363,22 +363,12 @@ void showUsage()
enum enum
{ {
MODE_TORRENT_START = (1 << 0), MODE_META_COMMAND = 0,
MODE_TORRENT_STOP = (1 << 1), MODE_TORRENT_SET = (1 << 0),
MODE_TORRENT_VERIFY = (1 << 2), MODE_TORRENT_GET = (1 << 1),
MODE_TORRENT_REANNOUNCE = (1 << 3), MODE_TORRENT_ADD = (1 << 2),
MODE_TORRENT_SET = (1 << 4), MODE_TORRENT_REMOVE = (1 << 3),
MODE_TORRENT_GET = (1 << 5), MODE_SESSION_SET = (1 << 4)
MODE_TORRENT_ADD = (1 << 6),
MODE_TORRENT_REMOVE = (1 << 7),
MODE_TORRENT_SET_LOCATION = (1 << 8),
MODE_SESSION_SET = (1 << 9),
MODE_SESSION_GET = (1 << 10),
MODE_SESSION_STATS = (1 << 11),
MODE_SESSION_CLOSE = (1 << 12),
MODE_BLOCKLIST_UPDATE = (1 << 13),
MODE_PORT_TEST = (1 << 14),
MODE_GROUP_GET = (1 << 15)
}; };
[[nodiscard]] int getOptMode(int val) [[nodiscard]] int getOptMode(int val)
@ -398,13 +388,13 @@ enum
case 't': /* set current torrent */ case 't': /* set current torrent */
case 'V': /* show version number */ case 'V': /* show version number */
case 944: /* print selected torrents' ids */ case 944: /* print selected torrents' ids */
return 0; return MODE_META_COMMAND;
case 'c': /* incomplete-dir */ case 'c': /* incomplete-dir */
case 'C': /* no-incomplete-dir */ case 'C': /* no-incomplete-dir */
case 'e': /* cache */ case 'e': /* cache */
case 'm': /* portmap */ case 'm': /* portmap */
case 'M': /* "no-portmap */ case 'M': /* no-portmap */
case 'o': /* dht */ case 'o': /* dht */
case 'O': /* no-dht */ case 'O': /* no-dht */
case 'p': /* incoming peer port */ case 'p': /* incoming peer port */
@ -447,9 +437,6 @@ enum
case 985: /* no-honor-session */ case 985: /* no-honor-session */
return MODE_TORRENT_SET; return MODE_TORRENT_SET;
case 920: /* session-info */
return MODE_SESSION_GET;
case 'g': /* get */ case 'g': /* get */
case 'G': /* no-get */ case 'G': /* no-get */
case 'L': /* labels */ case 'L': /* labels */
@ -464,9 +451,6 @@ enum
case 731: /* reset bandwidth group */ case 731: /* reset bandwidth group */
return MODE_TORRENT_SET | MODE_TORRENT_ADD; return MODE_TORRENT_SET | MODE_TORRENT_ADD;
case 961: /* find */
return MODE_TORRENT_SET_LOCATION | MODE_TORRENT_ADD;
case 'i': /* info */ case 'i': /* info */
case 'l': /* list all torrents */ case 'l': /* list all torrents */
case 940: /* info-files */ case 940: /* info-files */
@ -483,51 +467,31 @@ enum
case 930: /* peers */ case 930: /* peers */
return MODE_SESSION_SET | MODE_TORRENT_SET; return MODE_SESSION_SET | MODE_TORRENT_SET;
case 's': /* start */
return MODE_TORRENT_START | MODE_TORRENT_ADD;
case 'S': /* stop */
return MODE_TORRENT_STOP | MODE_TORRENT_ADD;
case 'w': /* download-dir */
return MODE_SESSION_SET | MODE_TORRENT_ADD;
case 850: /* session-close */
return MODE_SESSION_CLOSE;
case 963: /* blocklist-update */
return MODE_BLOCKLIST_UPDATE;
case 921: /* session-stats */
return MODE_SESSION_STATS;
case 'v': /* verify */
return MODE_TORRENT_VERIFY;
case 600: /* reannounce */
return MODE_TORRENT_REANNOUNCE;
case 962: /* port-test */
return MODE_PORT_TEST;
case 'r': /* remove */ case 'r': /* remove */
case 840: /* remove and delete */ case 840: /* remove and delete */
return MODE_TORRENT_REMOVE; return MODE_TORRENT_REMOVE;
case 's': /* start */
case 'S': /* stop */
case 'v': /* verify */
case 'w': /* download-dir */
case 600: /* reannounce */
case 850: /* session-close */
case 732: /* List groups */
case 920: /* session-info */
case 921: /* session-stats */
case 960: /* move */ case 960: /* move */
return MODE_TORRENT_SET_LOCATION; case 961: /* find */
case 962: /* port-test */
case 963: /* blocklist-update */
case 964: /* rename */ case 964: /* rename */
case 965: /* path */ case 965: /* path */
return MODE_TORRENT_SET_LOCATION | MODE_TORRENT_SET; return -1;
case 732: /* List groups */
return MODE_GROUP_GET;
default: default:
fmt::print(stderr, "unrecognized argument {:d}\n", val); fmt::print(stderr, "unrecognized argument {:d}\n", val);
assert("unrecognized argument" && 0); assert("unrecognized argument" && 0);
return 0; return -2;
} }
} }
@ -2404,7 +2368,7 @@ int processArgs(char const* rpcurl, int argc, char const* const* argv, RemoteCon
auto const optarg_sv = std::string_view{ optarg != nullptr ? optarg : "" }; auto const optarg_sv = std::string_view{ optarg != nullptr ? optarg : "" };
int const stepMode = getOptMode(c); int const stepMode = getOptMode(c);
if (stepMode == 0) /* meta commands */ if (stepMode == MODE_META_COMMAND) /* meta commands */
{ {
switch (c) switch (c)
{ {
@ -2977,25 +2941,16 @@ int processArgs(char const* rpcurl, int argc, char const* const* argv, RemoteCon
break; break;
} }
} }
else if (c == 961) /* set location */ else if (stepMode == MODE_TORRENT_REMOVE)
{ {
if (tadd.has_value()) auto top = tr_variant{};
{ tr_variantInitDict(&top, 2);
tr_variant* args = tr_variantDictFind(&tadd, TR_KEY_arguments); tr_variantDictAddStrView(&top, TR_KEY_method, "torrent-remove"sv);
tr_variantDictAddStr(args, TR_KEY_download_dir, optarg_sv); auto* args = tr_variantDictAddDict(&top, TR_KEY_arguments, 2);
} tr_variantDictAddBool(args, TR_KEY_delete_local_data, c == 840);
else addIdArg(args, config);
{ status |= flush(rpcurl, &top, config);
auto top = tr_variant{}; break;
tr_variantInitDict(&top, 2);
tr_variantDictAddStrView(&top, TR_KEY_method, "torrent-set-location"sv);
tr_variant* args = tr_variantDictAddDict(&top, TR_KEY_arguments, 3);
tr_variantDictAddStr(args, TR_KEY_location, optarg_sv);
tr_variantDictAddBool(args, TR_KEY_move, false);
addIdArg(args, config);
status |= flush(rpcurl, &top, config);
break;
}
} }
else else
{ {
@ -3119,19 +3074,6 @@ int processArgs(char const* rpcurl, int argc, char const* const* argv, RemoteCon
break; break;
} }
case 'r':
case 840:
{
auto top = tr_variant{};
tr_variantInitDict(&top, 2);
tr_variantDictAddStrView(&top, TR_KEY_method, "torrent-remove"sv);
auto* args = tr_variantDictAddDict(&top, TR_KEY_arguments, 2);
tr_variantDictAddBool(args, TR_KEY_delete_local_data, c == 840);
addIdArg(args, config);
status |= flush(rpcurl, &top, config);
break;
}
case 960: case 960:
{ {
auto top = tr_variant{}; auto top = tr_variant{};
@ -3145,6 +3087,28 @@ int processArgs(char const* rpcurl, int argc, char const* const* argv, RemoteCon
break; break;
} }
case 961: /* set location */
// TODO (5.0.0):
// 1. Remove tadd.has_value() branch
// 2. Group with --move under MODE_TORRENT_SET_LOCATION
if (tadd.has_value())
{
tr_variant* args = tr_variantDictFind(&tadd, TR_KEY_arguments);
tr_variantDictAddStr(args, TR_KEY_download_dir, optarg_sv);
}
else
{
auto top = tr_variant{};
tr_variantInitDict(&top, 2);
tr_variantDictAddStrView(&top, TR_KEY_method, "torrent-set-location"sv);
tr_variant* args = tr_variantDictAddDict(&top, TR_KEY_arguments, 3);
tr_variantDictAddStr(args, TR_KEY_location, optarg_sv);
tr_variantDictAddBool(args, TR_KEY_move, false);
addIdArg(args, config);
status |= flush(rpcurl, &top, config);
break;
}
case 964: case 964:
{ {
auto top = tr_variant{}; auto top = tr_variant{};