Support namespaces when creating view source files (#606)

This commit is contained in:
An Tao 2020-10-09 21:41:27 +08:00 committed by GitHub
parent 34d2fe45c3
commit c264c91f38
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 6 deletions

View File

@ -23,8 +23,8 @@ std::string create::detail()
return "Use create command to create some source files of drogon webapp\n\n"
"Usage:drogon_ctl create <view|controller|filter|project|model> "
"[-options] <object name>\n\n"
"drogon_ctl create view <csp file name> [-o <output path>]//create "
"HttpView source files from csp file\n\n"
"drogon_ctl create view <csp file name> [-o <output path>] [-n "
"<namespace>]//create HttpView source files from csp files\n\n"
"drogon_ctl create controller [-s] <[namespace::]class_name> //"
"create HttpSimpleController source files\n\n"
"drogon_ctl create controller -h <[namespace::]class_name> //"

View File

@ -14,6 +14,7 @@
#include "create_view.h"
#include "cmd.h"
#include <drogon/utils/Utilities.h>
#include <iostream>
#include <fstream>
#include <string>
@ -247,9 +248,9 @@ static void parseLine(std::ofstream &oSrcFile,
void create_view::handleCommand(std::vector<std::string> &parameters)
{
for (auto iter = parameters.begin(); iter != parameters.end(); iter++)
for (auto iter = parameters.begin(); iter != parameters.end();)
{
auto file = *iter;
auto &file = *iter;
if (file == "-o" || file == "--output")
{
iter = parameters.erase(iter);
@ -258,13 +259,24 @@ void create_view::handleCommand(std::vector<std::string> &parameters)
outputPath_ = *iter;
iter = parameters.erase(iter);
}
break;
continue;
}
else if (file == "-n" || file == "--namespace")
{
iter = parameters.erase(iter);
if (iter != parameters.end())
{
namespaces_ = utils::splitString(*iter, "::");
iter = parameters.erase(iter);
}
continue;
}
else if (file[0] == '-')
{
std::cout << ARGS_ERROR_STR << std::endl;
return;
}
++iter;
}
createViewFiles(parameters);
}
@ -324,11 +336,21 @@ void create_view::newViewHeaderFile(std::ofstream &file,
"it!\n";
file << "#include <drogon/DrTemplate.h>\n";
file << "using namespace drogon;\n";
for (auto &np : namespaces_)
{
file << "namespace " << np << "\n";
file << "{\n";
}
file << "class " << className << ":public DrTemplate<" << className
<< ">\n";
file << "{\npublic:\n\t" << className << "(){};\n\tvirtual ~" << className
<< "(){};\n\t"
"virtual std::string genText(const DrTemplateData &) override;\n};";
"virtual std::string genText(const DrTemplateData &) "
"override;\n};\n";
for (auto i = 0; i < namespaces_.size(); ++i)
{
file << "}\n";
}
}
void create_view::newViewSourceFile(std::ofstream &file,
@ -350,6 +372,22 @@ void create_view::newViewSourceFile(std::ofstream &file,
file << "#include <list>\n";
file << "#include <deque>\n";
file << "#include <queue>\n";
if (!namespaces_.empty())
{
file << "using namespace ";
for (int i = 0; i < namespaces_.size(); ++i)
{
if (i != namespaces_.size() - 1)
{
file << namespaces_[i] << "::";
}
else
{
file << namespaces_[i] << ";";
}
}
file << "\n";
}
// Find layout tag
std::string layoutName;
std::regex layoutReg("<%layout[ \\t]+(((?!%\\}).)*[^ \\t])[ \\t]*%>");

View File

@ -30,6 +30,7 @@ class create_view : public DrObject<create_view>, public CommandHandler
protected:
std::string outputPath_{"."};
std::vector<std::string> namespaces_;
void createViewFiles(std::vector<std::string> &cspFileNames);
int createViewFile(const std::string &script_filename);
void newViewHeaderFile(std::ofstream &file, const std::string &className);