consolidated command plumbing into one cogfile

This commit is contained in:
Nicholas O'Connor 2017-04-13 12:51:04 -07:00
parent d5ec9071ff
commit f83b5eb6d4
9 changed files with 47 additions and 128 deletions

View File

@ -11,16 +11,18 @@
using namespace cellar::commands; using namespace cellar::commands;
namespace cellar { namespace cellar {
namespace commands { namespace core {
/*[[[cog /*[[[cog
import cog import cog
with open("src/commands.txt") as commandsfile: with open("src/core/commands.txt") as commandsfile:
for line in commandsfile: for line in commandsfile:
item = line.strip().split(" ") item = line.strip().split(" ")
cog.outl("extern void {0} (int, vector<string>);".format(item[1])) cog.outl("extern void {0} (int, vector<string>);".format(item[1]))
]]]*/ ]]]*/
//[[[end]]] //[[[end]]]
}
namespace commands {
extern map<string, cellar::commands::CommandFunction> core_commands(); extern map<string, cellar::commands::CommandFunction> core_commands();
} }
} }

View File

@ -1,48 +0,0 @@
// vim: filetype=cpp :
#include <map>
#include "bottles.hpp"
#include "internal/bottles.hpp"
#include "commands.hpp"
#include "help.hpp"
using namespace std;
using namespace cellar::bottles;
using namespace cellar::commands;
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:
linesplit = line.strip().split(" ")
name = linesplit[0]
func = linesplit[1]
cog.outl("result.insert(pair<string,CommandFunction>(\"{0}\", &{1}));".format(name, func))
if (len(linesplit) > 2):
desc = " ".join(linesplit[2:]) # Rest of line assumed to be description
cog.outl("cellar::help::set_description(\"{0}\", \"{1}\");"
.format(name, desc
.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, trimblanklines=True)
cog.out(")\");")
else:
print("-- No details are available for the {0} command.".format(name))
]]]*/
//[[[end]]]
return result;
}

View File

@ -5,6 +5,8 @@
#include "commands.hpp" #include "commands.hpp"
#include "internal/core.hpp" #include "internal/core.hpp"
#include "internal/bottles.hpp"
#include "internal/launch.hpp"
#include "cellar.hpp" #include "cellar.hpp"
#include "help.hpp" #include "help.hpp"
@ -21,39 +23,51 @@ vector<string> cellar::commands::list_commands() {
return result; return result;
} }
map<string, CommandFunction> cellar::commands::core_commands() {
map<string, CommandFunction> result;
/*[[[cog /*[[[cog
import cog import cog
import os
import os.path import os.path
with open("src/commands.txt") as commandfile: def recurs_command_plumbing(dirname):
for line in commandfile: print(" -- Recursing into", dirname)
linesplit = line.strip().split(" ") for diritem in os.listdir(dirname):
name = linesplit[0] itempath = os.path.join(dirname, diritem)
func = linesplit[1] if os.path.isdir(itempath):
recurs_command_plumbing(itempath)
elif diritem == "commands.txt":
print(" -- Found commands file in", dirname + ", processing...")
base = os.path.basename(dirname)
cog.outl("map<string, CommandFunction> cellar::commands::{0}_commands() ".format(base) + "{")
cog.outl(" map<string, CommandFunction> result;")
with open(os.path.join(dirname, "commands.txt")) as commandfile:
for line in commandfile:
linesplit = line.strip().split(" ")
name = linesplit[0]
func = linesplit[1]
cog.outl("result.insert(pair<string,CommandFunction>(\"{0}\", &{1}));".format(name, func)) cog.outl("result.insert(pair<string,CommandFunction>(\"{0}\", &{2}::{1}));".format(name, func, base))
if (len(linesplit) > 2): if (len(linesplit) > 2):
desc = " ".join(linesplit[2:]) # Rest of line assumed to be description desc = " ".join(linesplit[2:]) # Rest of line assumed to be description
cog.outl("cellar::help::set_description(\"{0}\", \"{1}\");" cog.outl("cellar::help::set_description(\"{0}\", \"{1}\");"
.format(name, desc .format(name, desc
.replace("\\", "\\\\") .replace("\\", "\\\\")
.replace("\"", "\\\""))) .replace("\"", "\\\"")))
# the replace methods escape " and \ characters # the replace methods escape " and \ characters
else: else:
print("-- No description is available for the {0} command.".format(name)) print("-- No description is available for the {0} command.".format(name))
if os.path.exists("src/help/" + name): if os.path.exists("src/{0}/help/{1}".format(base, name)):
cog.out("cellar::help::set_details(\"{0}\", R\"(".format(name)) cog.out("cellar::help::set_details(\"{0}\", R\"(".format(name))
with open("src/help/" + name) as detailsfile: with open("src/{0}/help/{1}".format(base, name)) as detailsfile:
for detail in detailsfile: for detail in detailsfile:
cog.out(detail, trimblanklines=True) cog.out(detail, trimblanklines=True)
cog.out(")\");") cog.out(")\");")
else: else:
print("-- No details are available for the {0} command.".format(name)) print("-- No details are available for the {0} command.".format(name))
cog.outl(" return result;")
cog.outl("}")
recurs_command_plumbing("src")
]]]*/ ]]]*/
//[[[end]]] //[[[end]]]
return result;
}

View File

@ -13,7 +13,7 @@
using namespace std; using namespace std;
using namespace cellar; using namespace cellar;
void cellar::commands::help_command(int argc, vector<string> argv) { void cellar::core::help_command(int argc, vector<string> argv) {
vector<string> commands = list_commands(); vector<string> commands = list_commands();
cellar::print_header(); cellar::print_header();

View File

@ -1,49 +0,0 @@
// vim: filetype=cpp :
#include <map>
#include "launch.hpp"
#include "internal/launch.hpp"
#include "commands.hpp"
#include "dll.hpp"
#include "help.hpp"
using namespace std;
using namespace cellar::launch;
using namespace cellar::commands;
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:
linesplit = line.strip().split(" ")
name = linesplit[0]
func = linesplit[1]
cog.outl("result.insert(pair<string,CommandFunction>(\"{0}\", &{1}));".format(name, func))
if (len(linesplit) > 2):
desc = " ".join(linesplit[2:]) # Rest of line assumed to be description
cog.outl("cellar::help::set_description(\"{0}\", \"{1}\");"
.format(name, desc
.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, trimblanklines=True)
cog.out(")\");")
else:
print("-- No details are available for the {0} command.".format(name))
]]]*/
//[[[end]]]
return result;
}

View File

@ -43,6 +43,6 @@ string cellar::version::short_version() {
//[[[end]]] //[[[end]]]
} }
void cellar::commands::print_version(int argc, vector<string> argv) { void cellar::core::print_version(int argc, vector<string> argv) {
cellar::output::statement(short_version()); cellar::output::statement(short_version());
} }