C++ Code Generation
paradox generate --cpp [--path PATH]
Product Types
Input:
type Person
name: Text
age: Integer
admin: Boolean
Output:
struct Person {
std::string name;
int64_t age;
bool admin;
};
Union Types
Unions become std::variant:
using Cheese = std::variant<Farmers, Cheddar, Brie>;
With corresponding structs for each tag.
Validators
inline std::pair<bool, std::string> validate(Person const& x) {
std::vector<std::string> errors;
if (errors.empty()) { return {true, ""}; }
std::string msg;
for (size_t i = 0; i < errors.size(); ++i) {
if (i > 0) msg += "; ";
msg += errors[i];
}
return {false, msg};
}
inline bool is_valid(Person const& x) {
return validate(x).first;
}
JSON Serialization
Uses nlohmann/json:
inline void to_json(nlohmann::json& j, const Person& x) {
j = nlohmann::json::object();
j["name"] = x.name;
j["age"] = x.age;
j["admin"] = x.admin;
}
inline void from_json(const nlohmann::json& j, Person& x) {
j.at("name").get_to(x.name);
j.at("age").get_to(x.age);
j.at("admin").get_to(x.admin);
}
Header Structure
Generated files are #pragma once header-only. Includes:
-
<nlohmann/json.hpp>for JSON -
<variant>for unions -
<optional>for optionals -
<vector>for arrays -
<unordered_set>for sets
Helper templates for hashing std::vector and std::unordered_set are included once via #ifndef PARADOX_CPP_HELPERS_DEFINED.