src/struct_pb/tools/struct_code_generator.hpp (249 lines of code) (raw):
#pragma once
#include <string>
#include "struct_token.hpp"
char parameter_value[27] = "abcdefghijklmnopqrstuvwxyz";
std::string code_generate_header(const std::string &package_name) {
std::string result = "#pragma once\n#include <ylt/struct_pb.hpp>\n\n";
result.append("namespace ");
result.append(package_name);
result.append(" {\n\n");
return result;
}
std::string code_generate_struct_default(const std::string &struct_name,
bool enable_inherit) {
std::string result = "struct ";
result.append(struct_name);
if (enable_inherit) {
result.append(" : public iguana::base_impl<");
result.append(struct_name);
result.append("> ");
}
result.append(" {\n");
if (enable_inherit) {
result.append("\t");
result.append(struct_name);
result.append("() = default;\n\t");
}
return result;
}
std::string code_generate_struct_constructor(
const std::string &struct_name, const std::vector<struct_token> lists,
bool add_optional) {
std::string result = struct_name + "(";
int i = 0;
int list_size = lists.size() - 1;
for (auto it = lists.begin(); it != lists.end(); it++) {
if (it->type == struct_token_type::pod) {
if (it->lable == lable_type::lable_repeated) {
result.append("std::vector<");
result.append(it->type_name);
result.append("> ");
result += parameter_value[i];
}
else {
result.append(it->type_name);
result.append(" ");
result += parameter_value[i];
}
if (i != list_size)
result.append(", ");
i++;
}
else if (it->type == struct_token_type::proto_string) {
if (it->lable == lable_type::lable_repeated) {
if (add_optional) {
result.append("std::optional<");
}
result.append("std::vector<std::string>");
if (add_optional) {
result.append("> ");
}
result += parameter_value[i];
}
else {
if (add_optional) {
result.append("std::optional<");
}
result.append("std::");
result.append(it->type_name);
if (add_optional) {
result.append(">");
}
result.append(" ");
result += parameter_value[i];
}
if (i != list_size)
result.append(", ");
i++;
}
else if (it->type == struct_token_type::enum_type) {
// enum no repeated type
result.append(it->type_name);
result.append(" ");
result += parameter_value[i];
if (i != list_size)
result.append(", ");
i++;
}
else {
if (it->lable == lable_type::lable_repeated) {
if (add_optional) {
result.append("std::optional<");
}
result.append("std::vector<");
result.append(it->type_name);
result.append(">");
if (add_optional) {
result.append("> ");
}
result += parameter_value[i];
}
else {
if (add_optional) {
result.append("std::optional<");
}
result.append(it->type_name);
if (add_optional) {
result.append(">");
}
result.append(" ");
result += parameter_value[i];
}
if (i != list_size)
result.append(", ");
i++;
}
}
result.append(") : ");
int j = 0;
for (auto ll : lists) {
if (ll.type == struct_token_type::pod ||
ll.type == struct_token_type::message ||
ll.type == struct_token_type::enum_type) {
result.append(ll.var_name);
result.append("(");
if (ll.lable == lable_type::lable_repeated) {
result.append("std::move(");
result += parameter_value[j];
result.append(")");
if (j != list_size)
result.append("), ");
else
result.append(") {}");
}
else {
result += parameter_value[j];
if (j != list_size)
result.append("), ");
else
result.append(") {}");
}
}
else if (ll.type == struct_token_type::proto_string) {
result.append(ll.var_name);
result.append("(");
result.append("std::move(");
result += parameter_value[j];
result.append(")");
if (j != list_size)
result.append("), ");
else
result.append(") {}");
}
j++;
}
result.append("\n");
return result;
}
std::string code_generate_body(const std::vector<struct_token> &lists,
bool add_optional) {
std::string result;
for (auto ll : lists) {
result.append("\t");
if (ll.lable == lable_type::lable_repeated) {
if (ll.type == struct_token_type::proto_string) {
if (add_optional) {
result.append("std::optional<");
}
result.append("std::vector<std::string>");
if (add_optional) {
result.append("> ");
}
result.append(ll.var_name);
result.append(";\n");
}
else {
if (ll.type == struct_token_type::message && add_optional) {
result.append("std::optional<");
}
result.append("std::vector<");
result.append(ll.type_name);
result.append(">");
if (ll.type == struct_token_type::message && add_optional) {
result.append("> ");
}
result.append(ll.var_name);
result.append(";\n");
}
}
else {
if (ll.type != struct_token_type::pod &&
ll.type != struct_token_type::enum_type && add_optional) {
result.append("std::optional<");
}
if (ll.type == struct_token_type::proto_string)
result.append("std::");
result.append(ll.type_name);
if (ll.type != struct_token_type::pod &&
ll.type != struct_token_type::enum_type && add_optional) {
result.append(">");
}
result.append(" ");
result.append(ll.var_name);
result.append(";\n");
}
}
result.append("};\n");
return result;
}
std::string code_generate_ylt_macro(const std::string &struct_name,
const std::vector<struct_token> &lists) {
std::string result = "YLT_REFL(";
result.append(struct_name);
result.append(", ");
int i = 0;
int list_size = lists.size() - 1;
for (auto ll : lists) {
if (i != list_size) {
result.append(ll.var_name);
result.append(", ");
}
else {
result.append(ll.var_name);
}
i++;
}
result.append(");\n\n");
return result;
}
std::string code_generate_enum(const struct_enum &enum_inst) {
std::string result = "enum class ";
if (enum_inst.enum_name_.empty())
return "";
result.append(enum_inst.enum_name_);
result.append(" {\n");
if (enum_inst.fields_.size() == 0) {
result.append("}\n");
}
else {
for (auto i : enum_inst.fields_) {
result.append("\t");
result.append(i.first);
result.append(" = ");
result.append(std::to_string(i.second));
result.append(",\n");
}
result.append("};\n\n");
}
return result;
}
std::string code_generate_last_part() { return "}"; }