2026-03-24 10:14:17 -04:00
|
|
|
#ifndef GENERATOR_LIB_H
|
|
|
|
|
#define GENERATOR_LIB_H
|
|
|
|
|
|
|
|
|
|
#include <QString>
|
|
|
|
|
#include <QJsonArray>
|
|
|
|
|
#include <QTextStream>
|
|
|
|
|
#include <QVector>
|
|
|
|
|
#include <QPair>
|
|
|
|
|
|
|
|
|
|
struct ParsedMethod {
|
|
|
|
|
QString returnType;
|
|
|
|
|
QString name;
|
|
|
|
|
QVector<QPair<QString, QString>> params; // (type, name)
|
2026-06-04 11:38:27 -03:00
|
|
|
QString description; // doc comment adjacent to the LOGOS_METHOD declaration
|
2026-03-24 10:14:17 -04:00
|
|
|
};
|
|
|
|
|
|
2026-05-19 12:49:15 -03:00
|
|
|
// Which type surface to expose on the generated per-module wrapper.
|
|
|
|
|
// Each module's build picks ONE — there's no composite output. Default
|
|
|
|
|
// is Qt for backward compatibility; `interface: "universal"` modules
|
|
|
|
|
// flip to Std via the -DLOGOS_API_STYLE=std CMake flag the module
|
|
|
|
|
// builder threads through.
|
|
|
|
|
enum class ApiStyle { Qt, Std };
|
|
|
|
|
|
2026-06-05 20:44:43 -03:00
|
|
|
// Whether the generated wrapper targets ONE fixed module (the historical
|
|
|
|
|
// behaviour) or binds to a module name chosen at runtime.
|
|
|
|
|
// Static — the module name is baked into the ctor + every remote call,
|
|
|
|
|
// so `<Class>(LogosAPI*)` always talks to that one module.
|
|
|
|
|
// This is what name-baked dependency wrappers use.
|
|
|
|
|
// Bound — the ctor takes `(LogosAPI*, const QString& moduleName)` and
|
|
|
|
|
// stores it in `m_moduleName`; every remote call routes through
|
|
|
|
|
// that member. This is what *interface* wrappers use: one
|
|
|
|
|
// interface, bound to a concrete module name at runtime.
|
|
|
|
|
// Default is Static so existing callers and their generated output are
|
|
|
|
|
// byte-for-byte unchanged.
|
|
|
|
|
enum class BindMode { Static, Bound };
|
|
|
|
|
|
2026-03-24 10:14:17 -04:00
|
|
|
QString toPascalCase(const QString& name);
|
|
|
|
|
QString normalizeType(QString t);
|
|
|
|
|
QString mapParamType(const QString& qtType);
|
|
|
|
|
QString mapReturnType(const QString& qtType);
|
|
|
|
|
QString toQVariantConversion(const QString& type, const QString& argExpr);
|
2026-05-19 12:49:15 -03:00
|
|
|
|
|
|
|
|
// makeHeader / makeSource emit the single `<Class>` wrapper for a
|
|
|
|
|
// module. When `apiStyle == Std`, parameter / return types come from
|
|
|
|
|
// the std-typed mapping table (std::string / std::vector<std::string>
|
|
|
|
|
// / LogosMap / LogosList / int64_t / StdLogosResult) and the .cpp
|
|
|
|
|
// body wraps the QVariant wire with inline Qt↔std conversions —
|
|
|
|
|
// callers never include Qt headers. When `apiStyle == Qt`, the output
|
|
|
|
|
// matches the legacy Qt-typed surface (QString / QStringList /
|
|
|
|
|
// QVariantList / QVariantMap / int / LogosResult). The class name is
|
|
|
|
|
// always `<Module>` either way; the two styles are mutually exclusive.
|
|
|
|
|
//
|
|
|
|
|
// `events` carries typed event prototypes loaded from a `.lidl`
|
|
|
|
|
// sidecar via --events-from. Each entry is
|
|
|
|
|
// { "name": "<event>", "params": [ { "name": "...", "type": "<QtTypeName>" } ] }
|
|
|
|
|
// (Qt-typed names — same surface methods come through). When non-empty,
|
|
|
|
|
// the wrapper also gets one `on<EventName>(callback)` accessor per
|
|
|
|
|
// event next to the existing generic `onEvent(name, callback)` channel.
|
|
|
|
|
// The accessor signature uses the apiStyle's type surface for the
|
|
|
|
|
// callback's argument types.
|
2026-06-05 20:44:43 -03:00
|
|
|
//
|
|
|
|
|
// `bindMode` selects a fixed-module wrapper (Static, default) or a
|
|
|
|
|
// runtime-bound interface wrapper (Bound) — see BindMode above. In Bound
|
|
|
|
|
// mode `moduleName` is used only for the class/file naming the caller
|
|
|
|
|
// already decided; the emitted code never bakes it into a call.
|
|
|
|
|
QString makeHeader(const QString& moduleName, const QString& className, const QJsonArray& methods, ApiStyle apiStyle = ApiStyle::Qt, const QJsonArray& events = {}, BindMode bindMode = BindMode::Static);
|
|
|
|
|
QString makeSource(const QString& moduleName, const QString& className, const QString& headerBaseName, const QJsonArray& methods, ApiStyle apiStyle = ApiStyle::Qt, const QJsonArray& events = {}, BindMode bindMode = BindMode::Static);
|
2026-03-24 10:14:17 -04:00
|
|
|
QVector<ParsedMethod> parseProviderHeader(const QString& headerPath, QTextStream& err);
|
|
|
|
|
|
|
|
|
|
#endif // GENERATOR_LIB_H
|