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.