#include "command_registry.hpp" #include "config.hpp" #include "utils/utils.hpp" #include "utils/directories.hpp" #include "shared_commands.hpp" #include "version.hpp" #include #include #include #include #include #include "utils/assert.hpp" namespace dropshell { void help_autocomplete(const CommandContext& ctx); int help_handler(const CommandContext& ctx); static std::vector help_name_list={"help","h","--help","-h"}; // Static registration struct HelpCommandRegister { HelpCommandRegister() { CommandRegistry::instance().register_command({ help_name_list, help_handler, help_autocomplete, false, // hidden false, // requires_config false, // requires_install 0, // min_args (after command) 1, // max_args (after command) "help [COMMAND]", "Show help for dropshell, or detailed help for a specific command.", // heredoc R"( Show help for dropshell, or detailed help for a specific command. If you want to see documentation, please visit the DropShell website: https://dropshell.app )" }); } } help_command_register; void help_autocomplete(const CommandContext& ctx) { if (ctx.args.size() == 1) { // list all commands for (const auto& cmd : CommandRegistry::instance().list_primary_commands(false)) { rawout << cmd << std::endl; } } return; } void show_command(const std::string& cmd) { const auto& cmd_info = CommandRegistry::instance().find_command(cmd); if (!cmd_info) { error << "Unknown command: " << cmd << std::endl; return; } info << " "; info << left_align(cmd_info->help_usage, 32); info << cmd_info->help_description << std::endl; } extern const std::string VERSION; extern const std::string RELEASE_DATE; extern const std::string AUTHOR; extern const std::string LICENSE; int show_command_help(const std::string& cmd) { const auto& cmd_info = CommandRegistry::instance().find_command(cmd); if (!cmd_info) { error << "Unknown command: " << cmd << std::endl; return 1; } info << "Command " << cmd << " usage:" << std::endl; info << " "; info << left_align(cmd_info->help_usage, 32); info << cmd_info->help_description << std::endl; info << std::endl; info << " Equivalent names: "; bool first = true; for (const auto& name : cmd_info->names) { if (!first) info << ", "; info << name; first = false; } info << std::endl; info << cmd_info->full_help << std::endl << std::endl; return 0; } int help_handler(const CommandContext& ctx) { if (ctx.args.size() > 0) return show_command_help(ctx.args[0]); info << std::endl; maketitle("DropShell version " + VERSION); info << std::endl; info << "A tool for managing remote servers, by " << AUTHOR << std::endl; info << std::endl; info << "dropshell ..." << std::endl; show_command("help"); show_command("edit"); if (gConfig().is_config_set()) { // show more! show_command("list"); std::cout << std::endl; show_command("install"); show_command("uninstall"); show_command("nuke"); std::cout << std::endl; show_command("start"); show_command("stop"); std::cout << std::endl; show_command("ssh"); std::cout << std::endl; } return 0; } } // namespace dropshell