#ifndef DYNAMICMETAOBJECTBUILDER_H
#define DYNAMICMETAOBJECTBUILDER_H
#include <QMetaObject>
#include <cstdint>
#include <memory>
#include "rust/cxx.h"
class MetaMethodIncomingParams;
class QMetaType;
class QObject;
class QVariant;
class DynamicMetaObjectBuilder
{
public:
using PropertyGetterFn = rust::Fn<QVariant(uint8_t* receiver)>;
using PropertySetterFn = rust::Fn<void(uint8_t* receiver, const QVariant& value)>;
using SlotCallbackFn = rust::Fn<void(uint8_t* receiver, rust::Slice<const uint8_t* const> inputs, rust::Slice<uint8_t* const> output)>;
DynamicMetaObjectBuilder(const QMetaObject* staticMetaObj, rust::Str className);
void setToQObject(QObject& dst) const;
const QMetaObject* getDynamicQMetaObject() const;
void addClassInfo(rust::Str name, rust::Str value);
void registerProperty(rust::Str name, const QMetaType& metaType, PropertyGetterFn getter, PropertySetterFn setter, rust::Str notifySignal);
void registerPropertyReadOnly(rust::Str name, const QMetaType& metaType, PropertyGetterFn getter, bool isConstant, rust::Str notifySignal);
void registerSignal(rust::Str name, rust::Slice<const QMetaType> argMetaTypes);
void registerSlot(rust::Str name, rust::Slice<const QMetaType> argMetaTypes, const QMetaType& returnMetaType, SlotCallbackFn callback);
void endMetaRegistration();
void emitSignal(QObject& obj, rust::Str name, rust::Slice<const uint8_t* const> argv) const;
private:
class Impl;
std::unique_ptr<Impl> m_impl;
};
DynamicMetaObjectBuilder *createDynamicMetaObjectBuilder(rust::Str rustStructName, const QMetaObject& staticMeta);
#endif