From 7a81da49bcf19627b8a9868caf45f18321789f46 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 30 Nov 2021 13:14:47 +0100
Subject: [PATCH] MISC: Use the xdef trick to define all the supported MPD
 commands with their implementation

---
 inc/lektor/internal/commands.def | 64 ++++++++++++++++++++++++++++
 src/net/listen.c                 | 71 ++------------------------------
 2 files changed, 68 insertions(+), 67 deletions(-)
 create mode 100644 inc/lektor/internal/commands.def

diff --git a/inc/lektor/internal/commands.def b/inc/lektor/internal/commands.def
new file mode 100644
index 00000000..5fc2e22f
--- /dev/null
+++ b/inc/lektor/internal/commands.def
@@ -0,0 +1,64 @@
+mpd_command("currentsong",       command_currentsong,      SIMPLE)
+mpd_command("status",            command_status,           SIMPLE)
+mpd_command("stats",             command_stats,            SIMPLE)
+mpd_command("help",              command_help,             SIMPLE)
+
+mpd_command("next",              command_next,             SIMPLE)
+mpd_command("previous",          command_previous,         SIMPLE)
+mpd_command("pause",             command_pause,            SIMPLE)
+mpd_command("play",              command_play,             SIMPLE)
+mpd_command("playid",            command_playid,           SIMPLE)
+mpd_command("stop",              command_stop,             SIMPLE)
+mpd_command("seek",              command_seek,             SIMPLE)
+mpd_command("seekid",            command_seekid,           SIMPLE)
+mpd_command("seekcur",           command_seekcur,          SIMPLE)
+
+mpd_command("__insert",          command_add_5,            SIMPLE)
+mpd_command("add",               command_add_1,            SIMPLE)
+mpd_command("searchadd",         command_add_1,            SIMPLE)
+mpd_command("findadd",           command_add_1,            SIMPLE)
+mpd_command("addid",             command_addid,            SIMPLE)
+mpd_command("delete",            command_del,              SIMPLE)
+mpd_command("deleteid",          command_delid,            SIMPLE)
+mpd_command("clear",             command_clear,            SIMPLE)
+mpd_command("crop",              command_crop,             SIMPLE)
+mpd_command("move",              command_move,             SIMPLE)
+mpd_command("shuffle",           command_shuffle,          SIMPLE)
+mpd_command("swap",              command_swap,             SIMPLE)
+mpd_command("swapid",            command_swapid,           SIMPLE)
+mpd_command("__flat",            command_flat,             SIMPLE)
+
+mpd_command("playlistid",        command_queue_listid,     SIMPLE)
+mpd_command("playlist",          command_queue_list,       SIMPLE)
+mpd_command("playlistinfo",      command_queue_list,       SIMPLE)
+
+mpd_command("playlistclear",     command_plt_clear,        ANON)
+mpd_command("rename",            command_plt_rename,       ANON)
+mpd_command("playlistdelete",    command_plt_remove,       ANON)
+mpd_command("rm",                command_plt_remove,       ANON)
+mpd_command("playlistadd",       command_plt_add,          ANON)
+mpd_command("save",              command_plt_export,       ANON)
+mpd_command("__plt_import",      command_plt_import,       ANON)
+mpd_command("__dump",            command_dump,             ANON)
+mpd_command("listplaylists",     command_plt_list,         CONTINUATION)
+mpd_command("listplaylist",      command_plt_ctx,          CONTINUATION)
+mpd_command("sticker",           command_sticker_handle,   SIMPLE)
+
+mpd_command("password",          command_password,         SIMPLE)
+mpd_command("__adduser",         command_user_add,         SIMPLE)
+mpd_command("__restart",         command_restart,          SIMPLE)
+mpd_command("kill",              command_kill,             SIMPLE)
+mpd_command("__import",          command_import,           SIMPLE)
+mpd_command("__rescan",          command_rescan_true,      SIMPLE)
+mpd_command("update",            command_update,           SIMPLE)
+mpd_command("__dry_update",      command_dry_update,       SIMPLE)
+mpd_command("rescan",            command_rescan_false,     SIMPLE)
+mpd_command("config",            command_config,           SIMPLE)
+
+mpd_command("random",            command_set_playback_option_random,  SIMPLE)
+mpd_command("repeat",            command_set_playback_option_repeat,  SIMPLE)
+mpd_command("setvol",            command_set_playback_option_volume,  SIMPLE)
+mpd_command("single",            command_set_playback_option_single,  SIMPLE)
+mpd_command("consume",           command_set_playback_option_consume, SIMPLE)
+
+// vi:syntax=c
diff --git a/src/net/listen.c b/src/net/listen.c
index f836dca5..f734f7d1 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -172,73 +172,10 @@ ___cmd_trie_init(void)
     LOG_INFO("CMD_TRIE", "Init the command trie");
     cmd_trie_root = cmd_trie_new();
 
-    // clang-format off
-#pragma message(TODO "We might want to do xdefs here with macros and one include")
-    cmd_trie_insert(cmd_trie_root, "currentsong",       FUNCTION_POINTER(command_currentsong),      LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "status",            FUNCTION_POINTER(command_status),           LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "stats",             FUNCTION_POINTER(command_stats),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "help",              FUNCTION_POINTER(command_help),             LKT_COMMAND_SIMPLE);
-
-    cmd_trie_insert(cmd_trie_root, "next",              FUNCTION_POINTER(command_next),             LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "previous",          FUNCTION_POINTER(command_previous),         LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "pause",             FUNCTION_POINTER(command_pause),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "play",              FUNCTION_POINTER(command_play),             LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "playid",            FUNCTION_POINTER(command_playid),           LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "stop",              FUNCTION_POINTER(command_stop),             LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "seek",              FUNCTION_POINTER(command_seek),             LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "seekid",            FUNCTION_POINTER(command_seekid),           LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "seekcur",           FUNCTION_POINTER(command_seekcur),          LKT_COMMAND_SIMPLE);
-
-    cmd_trie_insert(cmd_trie_root, "__insert",          FUNCTION_POINTER(command_add_5),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "add",               FUNCTION_POINTER(command_add_1),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "searchadd",         FUNCTION_POINTER(command_add_1),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "findadd",           FUNCTION_POINTER(command_add_1),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "addid",             FUNCTION_POINTER(command_addid),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "delete",            FUNCTION_POINTER(command_del),              LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "deleteid",          FUNCTION_POINTER(command_delid),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "clear",             FUNCTION_POINTER(command_clear),            LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "crop",              FUNCTION_POINTER(command_crop),             LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "move",              FUNCTION_POINTER(command_move),             LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "shuffle",           FUNCTION_POINTER(command_shuffle),          LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "swap",              FUNCTION_POINTER(command_swap),             LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "swapid",            FUNCTION_POINTER(command_swapid),           LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "__flat",            FUNCTION_POINTER(command_flat),             LKT_COMMAND_SIMPLE);
-
-    cmd_trie_insert(cmd_trie_root, "playlistid",        FUNCTION_POINTER(command_queue_listid),     LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "playlist",          FUNCTION_POINTER(command_queue_list),       LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "playlistinfo",      FUNCTION_POINTER(command_queue_list),       LKT_COMMAND_SIMPLE);
-
-    cmd_trie_insert(cmd_trie_root, "playlistclear",     FUNCTION_POINTER(command_plt_clear),        LKT_COMMAND_ANON);
-    cmd_trie_insert(cmd_trie_root, "rename",            FUNCTION_POINTER(command_plt_rename),       LKT_COMMAND_ANON);
-    cmd_trie_insert(cmd_trie_root, "playlistdelete",    FUNCTION_POINTER(command_plt_remove),       LKT_COMMAND_ANON);
-    cmd_trie_insert(cmd_trie_root, "rm",                FUNCTION_POINTER(command_plt_remove),       LKT_COMMAND_ANON);
-    cmd_trie_insert(cmd_trie_root, "playlistadd",       FUNCTION_POINTER(command_plt_add),          LKT_COMMAND_ANON);
-    cmd_trie_insert(cmd_trie_root, "save",              FUNCTION_POINTER(command_plt_export),       LKT_COMMAND_ANON);
-    cmd_trie_insert(cmd_trie_root, "__plt_import",      FUNCTION_POINTER(command_plt_import),       LKT_COMMAND_ANON);
-    cmd_trie_insert(cmd_trie_root, "__dump",            FUNCTION_POINTER(command_dump),             LKT_COMMAND_ANON);
-    cmd_trie_insert(cmd_trie_root, "listplaylists",     FUNCTION_POINTER(command_plt_list),         LKT_COMMAND_CONTINUATION);
-    cmd_trie_insert(cmd_trie_root, "listplaylist",      FUNCTION_POINTER(command_plt_ctx),          LKT_COMMAND_CONTINUATION);
-    cmd_trie_insert(cmd_trie_root, "sticker",           FUNCTION_POINTER(command_sticker_handle),   LKT_COMMAND_SIMPLE);
-
-    /* Commands that requires authentification. */
-    cmd_trie_insert(cmd_trie_root, "password",          FUNCTION_POINTER(command_password),         LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "__adduser",         FUNCTION_POINTER(command_user_add),         LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "__restart",         FUNCTION_POINTER(command_restart),          LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "kill",              FUNCTION_POINTER(command_kill),             LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "__import",          FUNCTION_POINTER(command_import),           LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "__rescan",          FUNCTION_POINTER(command_rescan_true),      LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "update",            FUNCTION_POINTER(command_update),           LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "__dry_update",      FUNCTION_POINTER(command_dry_update),       LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "rescan",            FUNCTION_POINTER(command_rescan_false),     LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "config",            FUNCTION_POINTER(command_config),           LKT_COMMAND_SIMPLE);
-
-    /* Playback next/prev control commands. */
-    cmd_trie_insert(cmd_trie_root, "random",            FUNCTION_POINTER(command_set_playback_option_random),  LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "repeat",            FUNCTION_POINTER(command_set_playback_option_repeat),  LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "setvol",            FUNCTION_POINTER(command_set_playback_option_volume),  LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "single",            FUNCTION_POINTER(command_set_playback_option_single),  LKT_COMMAND_SIMPLE);
-    cmd_trie_insert(cmd_trie_root, "consume",           FUNCTION_POINTER(command_set_playback_option_consume), LKT_COMMAND_SIMPLE);
-    // clang-format on
+#define mpd_command(str_name, c_func, command_type) \
+    cmd_trie_insert(cmd_trie_root, str_name, FUNCTION_POINTER(c_func), LKT_COMMAND_##command_type);
+#include "lektor/internal/commands.def"
+#undef mpd_command
 
     cmd_trie_print(cmd_trie_root);
 }
-- 
GitLab