#pragma once #include #include #include #include #include #include // Include existing data structures #include "proceduredata.h" class ProcedureParser : public QObject { Q_OBJECT public: explicit ProcedureParser(QObject *parent = nullptr); ~ProcedureParser(); // Configuration file loading and parsing bool loadConfig(const QString &filePath); ProcedureConfig parseProcedureConfig(); // Configuration validation bool validateConfig(); QStringList getValidationErrors() const; // Table definition extraction TableDefinition getTableDefinition(const QString &tableRef); QMap getAllTableDefinitions(); // Lazy parsing - parse TestTaskGroup stages on demand (Stage 1: load stage // metadata) bool parseTestTaskGroupStages(TestTaskGroup &group, const QString &groupId); // Lazy parsing - parse TestActivityGroup actions on demand (Stage 2: load // actions) bool parseTestActivityGroupActions(TestActivityGroup &group, const QString &groupId); signals: void configLoaded(const QString &filePath); void configError(const QString &error, int line, int column); private: std::unique_ptr tree; QMap referenceCache; QMap stageNodeCache; QMap activityNodeCache; // Cache for lazy parsing of TestTaskGroups QStringList validationErrors; QString configFilePath; std::string yamlContent; // Store YAML content for in-place parsing // File parsing methods bool parseFile(const QString &filePath); // Reference handling void buildReferenceCache(); ryml::ConstNodeRef resolveReference(const QString &ref); QString extractRefPath(const ryml::ConstNodeRef &node); // Validation methods bool validateActivitySequence(); bool validateTableDefinitions(); // Parsing helper methods QString nodeToQString(const ryml::ConstNodeRef &node); QVariant nodeToQVariant(const ryml::ConstNodeRef &node); QVariantMap nodeToQVariantMap(const ryml::ConstNodeRef &node); QVariantList nodeToQVariantList(const ryml::ConstNodeRef &node); // Structure parsing methods FieldDefinition parseFieldDefinition(const ryml::ConstNodeRef &node); TableDefinition parseTableDefinition(const ryml::ConstNodeRef &node); StaticCell parseStaticCell(const ryml::ConstNodeRef &node); FieldSelector parseFieldSelector(const ryml::ConstNodeRef &node); TestAction parseTestAction(const ryml::ConstNodeRef &node); TestActivityGroup parseTestActivityGroup(const ryml::ConstNodeRef &node); TestTaskGroup parseTestTaskGroup(const ryml::ConstNodeRef &node); ResultDisplay parseResultDisplay(const ryml::ConstNodeRef &node); };