160 lines
4.5 KiB
C++
160 lines
4.5 KiB
C++
#include "command_registry.hpp"
|
|
#include "config.hpp"
|
|
#include "utils/utils.hpp"
|
|
#include "utils/directories.hpp"
|
|
#include "shared_commands.hpp"
|
|
#include "version.hpp"
|
|
|
|
#include <unistd.h>
|
|
#include <cstring>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <filesystem>
|
|
#include <libassert/assert.hpp>
|
|
|
|
namespace dropshell {
|
|
|
|
void help_autocomplete(const CommandContext& ctx);
|
|
int help_handler(const CommandContext& ctx);
|
|
|
|
static std::vector<std::string> 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() == 0) {
|
|
// 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) {
|
|
// get console width
|
|
int width = get_console_width() - 6; // 5 for [INF] + 1 for space
|
|
int firstcol = 34;
|
|
int secondcol = width - firstcol - 3;
|
|
|
|
const auto& cmd_info = CommandRegistry::instance().find_command(cmd);
|
|
if (!cmd_info)
|
|
{
|
|
error << "Unknown command: " << cmd << std::endl;
|
|
return;
|
|
}
|
|
|
|
if (cmd_info->help_usage.length() < width-secondcol)
|
|
{
|
|
std::string remaining_description = cmd_info->help_description;
|
|
|
|
info << " " << left_align(cmd_info->help_usage, firstcol) << get_line_wrap(remaining_description, secondcol);
|
|
while (!remaining_description.empty())
|
|
info << " " << left_align(" ",firstcol) << get_line_wrap(remaining_description, secondcol-1);
|
|
}
|
|
else
|
|
{
|
|
info << " " << cmd_info->help_usage << std::endl;
|
|
std::string remaining_description = cmd_info->help_description;
|
|
info << " " << left_align(" ",firstcol) << get_line_wrap(remaining_description, secondcol);
|
|
while (!remaining_description.empty())
|
|
info << " " << left_align(" ",firstcol) << get_line_wrap(remaining_description, secondcol-1);
|
|
}
|
|
}
|
|
|
|
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]);
|
|
|
|
std::cout << 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");
|
|
info << std::endl;
|
|
show_command("install");
|
|
show_command("uninstall");
|
|
show_command("destroy");
|
|
info << std::endl;
|
|
show_command("start");
|
|
show_command("stop");
|
|
info << std::endl;
|
|
show_command("ssh");
|
|
info << std::endl;
|
|
show_command("create-server");
|
|
show_command("create-service");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
} // namespace dropshell
|