Files
CalibratorLauncher/procedure/procedureparser.h
2026-01-02 19:20:35 +09:00

84 lines
2.7 KiB
C++

#pragma once
#include <QList>
#include <QMap>
#include <QString>
#include <QVariant>
#include <memory>
#include <ryml.hpp>
// 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<QString, TableDefinition> 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<ryml::Tree> tree;
QMap<QString, ryml::ConstNodeRef> referenceCache;
QMap<QString, ryml::ConstNodeRef> stageNodeCache;
QMap<QString, ryml::ConstNodeRef> 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);
};