refactor: intern RPC method names (#7892)

* refactor: add quarks for the RPC method names

* update tr_quark_convert() to handle RPC method names

* refactor: use interned keys for RPC method names

* test: add torrentGetLegacy test

* refactor: use interned keys for RPC method names in tr-qt

* refactor: use interned keys for RPC method names in tr-remote

* refactor: use interned keys for RPC method names in tests

* refactor: use interned keys for RPC method names in tr-gtk

* chore: fix readability-identifier-naming regression
This commit is contained in:
Charles Kerr
2025-12-09 11:48:09 -06:00
committed by GitHub
parent 095bad6568
commit 0979bbcc3f
11 changed files with 255 additions and 109 deletions

View File

@@ -73,11 +73,13 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"blocklist-date"sv,
"blocklist-enabled"sv,
"blocklist-size"sv,
"blocklist-update"sv,
"blocklist-updates-enabled"sv,
"blocklist-url"sv,
"blocklist_date"sv,
"blocklist_enabled"sv,
"blocklist_size"sv,
"blocklist_update"sv,
"blocklist_updates_enabled"sv,
"blocklist_url"sv,
"blocks"sv,
@@ -195,6 +197,8 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"flag_str"sv,
"flags"sv,
"format"sv,
"free-space"sv,
"free_space"sv,
"fromCache"sv,
"fromDht"sv,
"fromIncoming"sv,
@@ -210,6 +214,10 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"from_pex"sv,
"from_tracker"sv,
"group"sv,
"group-get"sv,
"group-set"sv,
"group_get"sv,
"group_set"sv,
"hasAnnounced"sv,
"hasScraped"sv,
"has_announced"sv,
@@ -398,8 +406,10 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"port"sv,
"port-forwarding-enabled"sv,
"port-is-open"sv,
"port-test"sv,
"port_forwarding_enabled"sv,
"port_is_open"sv,
"port_test"sv,
"preallocation"sv,
"preferred_transports"sv,
"primary-mime-type"sv,
@@ -417,9 +427,17 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"prompt-before-exit"sv,
"prompt_before_exit"sv,
"proxy_url"sv,
"queue-move-bottom"sv,
"queue-move-down"sv,
"queue-move-top"sv,
"queue-move-up"sv,
"queue-stalled-enabled"sv,
"queue-stalled-minutes"sv,
"queuePosition"sv,
"queue_move_bottom"sv,
"queue_move_down"sv,
"queue_move_top"sv,
"queue_move_up"sv,
"queue_position"sv,
"queue_stalled_enabled"sv,
"queue_stalled_minutes"sv,
@@ -535,11 +553,19 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"seeding_time_seconds"sv,
"sequential_download"sv,
"sequential_download_from_piece"sv,
"session-close"sv,
"session-count"sv,
"session-get"sv,
"session-id"sv,
"session-set"sv,
"session-stats"sv,
"sessionCount"sv,
"session_close"sv,
"session_count"sv,
"session_get"sv,
"session_id"sv,
"session_set"sv,
"session_stats"sv,
"show-backup-trackers"sv,
"show-extra-peer-details"sv,
"show-filterbar"sv,
@@ -600,6 +626,7 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"tcp_enabled"sv,
"tier"sv,
"time-checked"sv,
"torrent-add"sv,
"torrent-added"sv,
"torrent-added-notification-enabled"sv,
"torrent-added-verify-mode"sv,
@@ -608,10 +635,18 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"torrent-complete-sound-enabled"sv,
"torrent-duplicate"sv,
"torrent-get"sv,
"torrent-reannounce"sv,
"torrent-remove"sv,
"torrent-rename-path"sv,
"torrent-set"sv,
"torrent-set-location"sv,
"torrent-start"sv,
"torrent-start-now"sv,
"torrent-stop"sv,
"torrent-verify"sv,
"torrentCount"sv,
"torrentFile"sv,
"torrent_add"sv,
"torrent_added"sv,
"torrent_added_notification_enabled"sv,
"torrent_added_verify_mode"sv,
@@ -623,8 +658,15 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"torrent_duplicate"sv,
"torrent_file"sv,
"torrent_get"sv,
"torrent_reannounce"sv,
"torrent_remove"sv,
"torrent_rename_path"sv,
"torrent_set"sv,
"torrent_set_location"sv,
"torrent_start"sv,
"torrent_start_now"sv,
"torrent_stop"sv,
"torrent_verify"sv,
"torrents"sv,
"totalSize"sv,
"total_size"sv,
@@ -784,6 +826,7 @@ tr_quark tr_quark_convert(tr_quark q)
case TR_KEY_blocklist_date_kebab: return TR_KEY_blocklist_date;
case TR_KEY_blocklist_enabled_kebab: return TR_KEY_blocklist_enabled;
case TR_KEY_blocklist_size_kebab: return TR_KEY_blocklist_size;
case TR_KEY_blocklist_update_kebab: return TR_KEY_blocklist_update;
case TR_KEY_blocklist_updates_enabled_kebab: return TR_KEY_blocklist_updates_enabled;
case TR_KEY_blocklist_url_kebab: return TR_KEY_blocklist_url;
case TR_KEY_bytes_completed_camel: return TR_KEY_bytes_completed;
@@ -835,6 +878,7 @@ tr_quark tr_quark_convert(tr_quark q)
case TR_KEY_filter_text_kebab: return TR_KEY_filter_text;
case TR_KEY_filter_trackers_kebab: return TR_KEY_filter_trackers;
case TR_KEY_flag_str_camel: return TR_KEY_flag_str;
case TR_KEY_free_space_kebab: return TR_KEY_free_space;
case TR_KEY_from_cache_camel: return TR_KEY_from_cache;
case TR_KEY_from_dht_camel: return TR_KEY_from_dht;
case TR_KEY_from_incoming_camel: return TR_KEY_from_incoming;
@@ -842,6 +886,8 @@ tr_quark tr_quark_convert(tr_quark q)
case TR_KEY_from_ltep_camel: return TR_KEY_from_ltep;
case TR_KEY_from_pex_camel: return TR_KEY_from_pex;
case TR_KEY_from_tracker_camel: return TR_KEY_from_tracker;
case TR_KEY_group_get_kebab: return TR_KEY_group_get;
case TR_KEY_group_set_kebab: return TR_KEY_group_set;
case TR_KEY_hash_string_camel: return TR_KEY_hash_string;
case TR_KEY_has_announced_camel: return TR_KEY_has_announced;
case TR_KEY_has_scraped_camel: return TR_KEY_has_scraped;
@@ -919,12 +965,17 @@ tr_quark tr_quark_convert(tr_quark q)
case TR_KEY_piece_size_camel: return TR_KEY_piece_size;
case TR_KEY_port_forwarding_enabled_kebab: return TR_KEY_port_forwarding_enabled;
case TR_KEY_port_is_open_kebab: return TR_KEY_port_is_open;
case TR_KEY_port_test_kebab: return TR_KEY_port_test;
case TR_KEY_primary_mime_type_kebab: return TR_KEY_primary_mime_type;
case TR_KEY_priority_high_kebab: return TR_KEY_priority_high;
case TR_KEY_priority_low_kebab: return TR_KEY_priority_low;
case TR_KEY_priority_normal_kebab: return TR_KEY_priority_normal;
case TR_KEY_prompt_before_exit_kebab: return TR_KEY_prompt_before_exit;
case TR_KEY_queue_position_camel: return TR_KEY_queue_position;
case TR_KEY_queue_move_bottom_kebab: return TR_KEY_queue_move_bottom;
case TR_KEY_queue_move_down_kebab: return TR_KEY_queue_move_down;
case TR_KEY_queue_move_top_kebab: return TR_KEY_queue_move_top;
case TR_KEY_queue_move_up_kebab: return TR_KEY_queue_move_up;
case TR_KEY_queue_stalled_enabled_kebab: return TR_KEY_queue_stalled_enabled;
case TR_KEY_queue_stalled_minutes_kebab: return TR_KEY_queue_stalled_minutes;
case TR_KEY_rate_download_camel: return TR_KEY_rate_download;
@@ -981,10 +1032,14 @@ tr_quark tr_quark_convert(tr_quark q)
case TR_KEY_seed_ratio_mode_camel: return TR_KEY_seed_ratio_mode;
case TR_KEY_seeding_time_seconds_kebab: return TR_KEY_seeding_time_seconds;
case TR_KEY_seeder_count_camel: return TR_KEY_seeder_count;
case TR_KEY_session_close_kebab: return TR_KEY_session_close;
case TR_KEY_session_count_camel:
case TR_KEY_session_count_kebab:
return TR_KEY_session_count;
case TR_KEY_session_get_kebab: return TR_KEY_session_get;
case TR_KEY_session_id_kebab: return TR_KEY_session_id;
case TR_KEY_session_set_kebab: return TR_KEY_session_set;
case TR_KEY_session_stats_kebab: return TR_KEY_session_stats;
case TR_KEY_show_backup_trackers_kebab: return TR_KEY_show_backup_trackers;
case TR_KEY_show_extra_peer_details_kebab: return TR_KEY_show_extra_peer_details;
case TR_KEY_show_filterbar_kebab: return TR_KEY_show_filterbar;
@@ -1010,6 +1065,7 @@ tr_quark tr_quark_convert(tr_quark q)
case TR_KEY_start_minimized_kebab: return TR_KEY_start_minimized;
case TR_KEY_statusbar_stats_kebab: return TR_KEY_statusbar_stats;
case TR_KEY_tcp_enabled_kebab: return TR_KEY_tcp_enabled;
case TR_KEY_torrent_add_kebab: return TR_KEY_torrent_add;
case TR_KEY_torrent_added_kebab: return TR_KEY_torrent_added;
case TR_KEY_torrent_added_notification_enabled_kebab: return TR_KEY_torrent_added_notification_enabled;
case TR_KEY_torrent_added_verify_mode_kebab: return TR_KEY_torrent_added_verify_mode;
@@ -1020,8 +1076,15 @@ tr_quark tr_quark_convert(tr_quark q)
case TR_KEY_torrent_duplicate_kebab: return TR_KEY_torrent_duplicate;
case TR_KEY_torrent_file_camel: return TR_KEY_torrent_file;
case TR_KEY_torrent_get_kebab: return TR_KEY_torrent_get;
case TR_KEY_torrent_reannounce_kebab: return TR_KEY_torrent_reannounce;
case TR_KEY_torrent_remove_kebab: return TR_KEY_torrent_remove;
case TR_KEY_torrent_rename_path_kebab: return TR_KEY_torrent_rename_path;
case TR_KEY_torrent_set_kebab: return TR_KEY_torrent_set;
case TR_KEY_torrent_set_location_kebab: return TR_KEY_torrent_set_location;
case TR_KEY_torrent_start_kebab: return TR_KEY_torrent_start;
case TR_KEY_torrent_start_now_kebab: return TR_KEY_torrent_start_now;
case TR_KEY_torrent_stop_kebab: return TR_KEY_torrent_stop;
case TR_KEY_torrent_verify_kebab: return TR_KEY_torrent_verify;
case TR_KEY_total_size_camel: return TR_KEY_total_size;
case TR_KEY_tracker_add_camel: return TR_KEY_tracker_add;
case TR_KEY_tracker_list_camel: return TR_KEY_tracker_list;

View File

@@ -71,11 +71,13 @@ enum // NOLINT(performance-enum-size)
TR_KEY_blocklist_date_kebab,
TR_KEY_blocklist_enabled_kebab,
TR_KEY_blocklist_size_kebab,
TR_KEY_blocklist_update_kebab,
TR_KEY_blocklist_updates_enabled_kebab,
TR_KEY_blocklist_url_kebab,
TR_KEY_blocklist_date,
TR_KEY_blocklist_enabled,
TR_KEY_blocklist_size,
TR_KEY_blocklist_update,
TR_KEY_blocklist_updates_enabled,
TR_KEY_blocklist_url,
TR_KEY_blocks,
@@ -193,6 +195,8 @@ enum // NOLINT(performance-enum-size)
TR_KEY_flag_str,
TR_KEY_flags,
TR_KEY_format,
TR_KEY_free_space_kebab,
TR_KEY_free_space,
TR_KEY_from_cache_camel,
TR_KEY_from_dht_camel,
TR_KEY_from_incoming_camel,
@@ -208,6 +212,10 @@ enum // NOLINT(performance-enum-size)
TR_KEY_from_pex,
TR_KEY_from_tracker,
TR_KEY_group,
TR_KEY_group_get_kebab,
TR_KEY_group_set_kebab,
TR_KEY_group_get,
TR_KEY_group_set,
TR_KEY_has_announced_camel,
TR_KEY_has_scraped_camel,
TR_KEY_has_announced,
@@ -396,8 +404,10 @@ enum // NOLINT(performance-enum-size)
TR_KEY_port,
TR_KEY_port_forwarding_enabled_kebab,
TR_KEY_port_is_open_kebab,
TR_KEY_port_test_kebab,
TR_KEY_port_forwarding_enabled,
TR_KEY_port_is_open,
TR_KEY_port_test,
TR_KEY_preallocation,
TR_KEY_preferred_transports,
TR_KEY_primary_mime_type_kebab,
@@ -415,9 +425,17 @@ enum // NOLINT(performance-enum-size)
TR_KEY_prompt_before_exit_kebab,
TR_KEY_prompt_before_exit,
TR_KEY_proxy_url,
TR_KEY_queue_move_bottom_kebab,
TR_KEY_queue_move_down_kebab,
TR_KEY_queue_move_top_kebab,
TR_KEY_queue_move_up_kebab,
TR_KEY_queue_stalled_enabled_kebab,
TR_KEY_queue_stalled_minutes_kebab,
TR_KEY_queue_position_camel,
TR_KEY_queue_move_bottom,
TR_KEY_queue_move_down,
TR_KEY_queue_move_top,
TR_KEY_queue_move_up,
TR_KEY_queue_position,
TR_KEY_queue_stalled_enabled,
TR_KEY_queue_stalled_minutes,
@@ -533,11 +551,19 @@ enum // NOLINT(performance-enum-size)
TR_KEY_seeding_time_seconds,
TR_KEY_sequential_download,
TR_KEY_sequential_download_from_piece,
TR_KEY_session_close_kebab,
TR_KEY_session_count_kebab,
TR_KEY_session_get_kebab,
TR_KEY_session_id_kebab,
TR_KEY_session_set_kebab,
TR_KEY_session_stats_kebab,
TR_KEY_session_count_camel,
TR_KEY_session_close,
TR_KEY_session_count,
TR_KEY_session_get,
TR_KEY_session_id,
TR_KEY_session_set,
TR_KEY_session_stats,
TR_KEY_show_backup_trackers_kebab,
TR_KEY_show_extra_peer_details_kebab,
TR_KEY_show_filterbar_kebab,
@@ -598,6 +624,7 @@ enum // NOLINT(performance-enum-size)
TR_KEY_tcp_enabled,
TR_KEY_tier,
TR_KEY_time_checked,
TR_KEY_torrent_add_kebab,
TR_KEY_torrent_added_kebab,
TR_KEY_torrent_added_notification_enabled_kebab,
TR_KEY_torrent_added_verify_mode_kebab,
@@ -606,10 +633,18 @@ enum // NOLINT(performance-enum-size)
TR_KEY_torrent_complete_sound_enabled_kebab,
TR_KEY_torrent_duplicate_kebab,
TR_KEY_torrent_get_kebab,
TR_KEY_torrent_reannounce_kebab,
TR_KEY_torrent_remove_kebab,
TR_KEY_torrent_rename_path_kebab,
TR_KEY_torrent_set_kebab,
TR_KEY_torrent_set_location_kebab,
TR_KEY_torrent_start_kebab,
TR_KEY_torrent_start_now_kebab,
TR_KEY_torrent_stop_kebab,
TR_KEY_torrent_verify_kebab,
TR_KEY_torrent_count_camel,
TR_KEY_torrent_file_camel,
TR_KEY_torrent_add,
TR_KEY_torrent_added,
TR_KEY_torrent_added_notification_enabled,
TR_KEY_torrent_added_verify_mode,
@@ -621,8 +656,15 @@ enum // NOLINT(performance-enum-size)
TR_KEY_torrent_duplicate,
TR_KEY_torrent_file,
TR_KEY_torrent_get,
TR_KEY_torrent_reannounce,
TR_KEY_torrent_remove,
TR_KEY_torrent_rename_path,
TR_KEY_torrent_set,
TR_KEY_torrent_set_location,
TR_KEY_torrent_start,
TR_KEY_torrent_start_now,
TR_KEY_torrent_stop,
TR_KEY_torrent_verify,
TR_KEY_torrents,
TR_KEY_total_size_camel,
TR_KEY_total_size,

View File

@@ -19,6 +19,8 @@
#include <fmt/format.h>
#include <small/map.hpp>
#include <libdeflate.h>
#include "libtransmission/transmission.h"
@@ -2809,36 +2811,36 @@ namespace session_get_helpers
using SyncHandler = std::pair<JsonRpc::Error::Code, std::string> (*)(tr_session*, tr_variant::Map const&, tr_variant::Map&);
auto constexpr SyncHandlers = std::array<std::tuple<std::string_view, SyncHandler, bool /*has_side_effects*/>, 20U>{ {
{ "free_space"sv, freeSpace, false },
{ "group_get"sv, groupGet, false },
{ "group_set"sv, groupSet, true },
{ "queue_move_bottom"sv, queueMoveBottom, true },
{ "queue_move_down"sv, queueMoveDown, true },
{ "queue_move_top"sv, queueMoveTop, true },
{ "queue_move_up"sv, queueMoveUp, true },
{ "session_close"sv, sessionClose, true },
{ "session_get"sv, sessionGet, false },
{ "session_set"sv, sessionSet, true },
{ "session_stats"sv, sessionStats, false },
{ "torrent_get"sv, torrentGet, false },
{ "torrent_reannounce"sv, torrentReannounce, true },
{ "torrent_remove"sv, torrentRemove, true },
{ "torrent_set"sv, torrentSet, true },
{ "torrent_set_location"sv, torrentSetLocation, true },
{ "torrent_start"sv, torrentStart, true },
{ "torrent_start_now"sv, torrentStartNow, true },
{ "torrent_stop"sv, torrentStop, true },
{ "torrent_verify"sv, torrentVerify, true },
auto const sync_handlers = small::max_size_map<tr_quark, std::pair<SyncHandler, bool /*has_side_effects*/>, 20U>{ {
{ TR_KEY_free_space, { freeSpace, false } },
{ TR_KEY_group_get, { groupGet, false } },
{ TR_KEY_group_set, { groupSet, true } },
{ TR_KEY_queue_move_bottom, { queueMoveBottom, true } },
{ TR_KEY_queue_move_down, { queueMoveDown, true } },
{ TR_KEY_queue_move_top, { queueMoveTop, true } },
{ TR_KEY_queue_move_up, { queueMoveUp, true } },
{ TR_KEY_session_close, { sessionClose, true } },
{ TR_KEY_session_get, { sessionGet, false } },
{ TR_KEY_session_set, { sessionSet, true } },
{ TR_KEY_session_stats, { sessionStats, false } },
{ TR_KEY_torrent_get, { torrentGet, false } },
{ TR_KEY_torrent_reannounce, { torrentReannounce, true } },
{ TR_KEY_torrent_remove, { torrentRemove, true } },
{ TR_KEY_torrent_set, { torrentSet, true } },
{ TR_KEY_torrent_set_location, { torrentSetLocation, true } },
{ TR_KEY_torrent_start, { torrentStart, true } },
{ TR_KEY_torrent_start_now, { torrentStartNow, true } },
{ TR_KEY_torrent_stop, { torrentStop, true } },
{ TR_KEY_torrent_verify, { torrentVerify, true } },
} };
using AsyncHandler = void (*)(tr_session*, tr_variant::Map const&, DoneCb&&, tr_rpc_idle_data*);
auto constexpr AsyncHandlers = std::array<std::tuple<std::string_view, AsyncHandler, bool /*has_side_effects*/>, 4U>{ {
{ "blocklist_update"sv, blocklistUpdate, true },
{ "port_test"sv, portTest, false },
{ "torrent_add"sv, torrentAdd, true },
{ "torrent_rename_path"sv, torrentRenamePath, true },
auto const async_handlers = small::max_size_map<tr_quark, std::pair<AsyncHandler, bool /*has_side_effects*/>, 4U>{ {
{ TR_KEY_blocklist_update, { blocklistUpdate, true } },
{ TR_KEY_port_test, { portTest, false } },
{ TR_KEY_torrent_add, { torrentAdd, true } },
{ TR_KEY_torrent_rename_path, { torrentRenamePath, true } },
} };
void noop_response_callback(tr_session* /*session*/, tr_variant&& /*response*/)
@@ -2887,6 +2889,7 @@ void tr_rpc_request_exec_impl(tr_session* session, tr_variant const& request, tr
}
auto const method_name = map->value_if<std::string_view>(TR_KEY_method).value_or(""sv);
auto const method_key = tr_quark_convert(tr_quark_new(method_name));
auto data = tr_rpc_idle_data{};
data.session = session;
@@ -2924,22 +2927,9 @@ void tr_rpc_request_exec_impl(tr_session* session, tr_variant const& request, tr
auto done_cb = is_jsonrpc ? tr_rpc_idle_done : tr_rpc_idle_done_legacy;
auto const test = [method_name](auto const& handler)
if (auto const handler = async_handlers.find(method_key); handler != std::end(async_handlers))
{
auto const& name = std::get<0>(handler);
if (name == method_name)
{
return true;
}
auto kebab_case = std::string{ name };
std::replace(std::begin(kebab_case), std::end(kebab_case), '_', '-');
return kebab_case == method_name;
};
if (auto const end = std::end(AsyncHandlers), handler = std::find_if(std::begin(AsyncHandlers), end, test); handler != end)
{
auto const& [name, func, has_side_effects] = *handler;
auto const& [func, has_side_effects] = handler->second;
if (is_notification && !has_side_effects)
{
done_cb(&data, Error::SUCCESS, {});
@@ -2958,9 +2948,9 @@ void tr_rpc_request_exec_impl(tr_session* session, tr_variant const& request, tr
return;
}
if (auto const end = std::end(SyncHandlers), handler = std::find_if(std::begin(SyncHandlers), end, test); handler != end)
if (auto const handler = sync_handlers.find(method_key); handler != std::end(sync_handlers))
{
auto const& [name, func, has_side_effects] = *handler;
auto const& [func, has_side_effects] = handler->second;
if (is_notification && !has_side_effects)
{
done_cb(&data, Error::SUCCESS, {});