improvements to the help command, including outputting detailed descriptions

This commit is contained in:
Nicholas O'Connor 2017-03-25 00:25:20 -07:00
parent de77c55df7
commit 3dc004d27a
10 changed files with 109 additions and 12 deletions

View File

@ -10,6 +10,9 @@ namespace cellar {
namespace help {
extern void set_description(string,string);
extern string get_description(string);
extern void set_details(string,string);
extern string get_details(string);
}
}

View File

@ -5,6 +5,7 @@
#include "internal/bottles.hpp"
#include "commands.hpp"
#include "dll.hpp"
#include "help.hpp"
using namespace std;
using namespace cellar::bottles;
@ -14,6 +15,7 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::bottles_commands() {
map<string, CommandFunction> result;
/*[[[cog
import cog
import os
with open("src/bottles/commands.txt") as commandfile:
for line in commandfile:
@ -30,6 +32,17 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::bottles_commands() {
.replace("\"", "\\\"")
.replace("\\", "\\\\")))
# the replace methods escape " and \ characters
else:
print("-- No description is available for the {0} command.".format(name))
if os.path.exists("src/bottles/help/" + name):
cog.out("cellar::help::set_details(\"{0}\", R\"(".format(name))
with open("src/bottles/help/" + name) as detailsfile:
for detail in detailsfile:
cog.out(detail)
cog.out(")\");")
else:
print("-- No details are available for the {0} command.".format(name))
]]]*/
//[[[end]]]
return result;

View File

@ -25,6 +25,7 @@ map<string, CommandFunction> cellar::commands::core_commands() {
map<string, CommandFunction> result;
/*[[[cog
import cog
import os.path
with open("src/commands.txt") as commandfile:
for line in commandfile:
@ -41,6 +42,17 @@ map<string, CommandFunction> cellar::commands::core_commands() {
.replace("\"", "\\\"")
.replace("\\", "\\\\")))
# the replace methods escape " and \ characters
else:
print("-- No description is available for the {0} command.".format(name))
if os.path.exists("src/help/" + name):
cog.out("cellar::help::set_details(\"{0}\", R\"(".format(name))
with open("src/help/" + name) as detailsfile:
for detail in detailsfile:
cog.out(detail)
cog.out(")\");")
else:
print("-- No details are available for the {0} command.".format(name))
]]]*/
//[[[end]]]
return result;

26
src/help/details.cpp Normal file
View File

@ -0,0 +1,26 @@
#include <map>
#include <string>
#include "help.hpp"
map<string,string> details_map;
void cellar::help::set_details(string command, string details) {
if (details.empty()) {
if (details_map.find(command) == details_map.end()) { // not found
return; // no details no cry
} else {
details_map.erase(command);
}
} else { // setting details
details_map[command] = details;
}
}
string cellar::help::get_details(string command) {
if (details_map.find(command) == details_map.end()) { // not found
return "";
} else {
return details_map.at(command);
}
}

View File

@ -3,6 +3,8 @@
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>
#include "cellar.hpp"
#include "internal/core.hpp"
#include "help.hpp"
@ -17,16 +19,41 @@ void cellar::commands::help_command(int argc, vector<string> argv) {
cout << endl; // TODO: cellar::output function for code clarity
output::statement("You have these commands:");
stringstream sstr;
for (string command : commands) {
sstr << "\t" << command;
if (argc == 1) {
output::statement("You have these commands:");
stringstream sstr;
for (string command : commands) {
sstr << "\t" << command;
string desc = help::get_description(command);
if (!desc.empty()) {
sstr << " - " << desc;
}
output::statement(sstr.str());
sstr.str("");
}
} else {
string command = argv[1];
stringstream sstr;
sstr << "cellar " << command << " - ";
string desc = help::get_description(command);
if (!desc.empty()) {
sstr << " - " << desc;
}
if (desc.empty()) { sstr << "no description is available."; }
else { sstr << desc; }
output::statement(sstr.str());
sstr.str("");
cout << endl;
string details = help::get_details(command);
if (details.empty()) { output::statement("no details available."); }
else {
vector<string> detaillines;
boost::split(detaillines, details, boost::is_any_of("\n"));
for (string line : detaillines) {
if (!line.empty()) { output::statement(line); }
else { cout << endl; }
}
}
}
}

1
src/help/version Normal file
View File

@ -0,0 +1 @@
No, really, that's all it does.

View File

@ -5,6 +5,7 @@
#include "internal/launch.hpp"
#include "commands.hpp"
#include "dll.hpp"
#include "help.hpp"
using namespace std;
using namespace cellar::launch;
@ -14,6 +15,7 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::launch_commands() {
map<string, CommandFunction> result;
/*[[[cog
import cog
import os
with open("src/launch/commands.txt") as commandfile:
for line in commandfile:
@ -30,6 +32,17 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::launch_commands() {
.replace("\"", "\\\"")
.replace("\\", "\\\\")))
# the replace methods escape " and \ characters
else:
print("-- No description is available for the {0} command.".format(name))
if os.path.exists("src/launch/help/" + name):
cog.out("cellar::help::set_details(\"{0}\", R\"(".format(name))
with open("src/launch/help/" + name) as detailsfile:
for detail in detailsfile:
cog.out(detail)
cog.out(")\");")
else:
print("-- No details are available for the {0} command.".format(name))
]]]*/
//[[[end]]]
return result;

View File

@ -1,3 +1,3 @@
launch launch_command
winecfg launch_winecfg
regedit launch_regedit
launch launch_command Launch a program in WINE.
winecfg launch_winecfg Launch winecfg.
regedit launch_regedit Launch regedit.

1
src/launch/help/regedit Normal file
View File

@ -0,0 +1 @@
This is an alias for "cellar launch regedit".

1
src/launch/help/winecfg Normal file
View File

@ -0,0 +1 @@
This is an alias for "cellar launch winecfg".