/
breton75
/
modus2
Обзор
Документация
Войти
/
breton75
/
modus2
Код
Запросы
0
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
framework/module/sv_module_config.cpp
151 строка
5 KB
breton75
Update .gitignore, configuration.h, and 1788 more files...
29 май 2025, 14:51
29 май 2025, 14:51
6ba4a1b
Код
Авторство
О чём код?
#include "sv_module_config.h" /*! функции для парсинга данных модулей из фомата json */ //void modus::get_modules_from_json(const QString& json_file, QList<modus::module::Config>* result) void modus::module::get_modules_from_json(const AppConfig& appcfg, QList<modus::module::Config>* result) { try { /// парсим список сигналов. в списке сигналов могут содержаться ссылки на другие файлы. /// парсер разбирает модули из всех файлов и добавляет их в module_list QList<QPair<QJsonValue, modus::module::GroupParams>> module_list; modus::module::GroupParams* gp = nullptr; if(!appcfg.case_value.isEmpty()) { gp = new modus::module::GroupParams; gp->case_value = QVariant(appcfg.case_value); } modus::module::parse_module_list(QFileInfo(appcfg.config_file_name).canonicalFilePath(), nullptr, gp, &module_list); for(QPair<QJsonValue, modus::module::GroupParams> &s: module_list) { if(!appcfg.case_value.isEmpty() && !s.second.case_value.isValid()) s.second.case_value = QVariant(appcfg.case_value); modus::module::Config config = modus::module::Config::fromJsonObject(s.first.toObject(), &(s.second)); result->append(config); } delete gp; } catch(SvException& e) { throw e; } } void modus::module::parse_module_list(QString json_file, QJsonArray* modules_array, modus::module::GroupParams* group_params, QList<QPair<QJsonValue, modus::module::GroupParams>>* result) { try { QJsonArray ja; // при первом вызове запоминаем путь к основному конфигу. от него пляшут все ссылки на другие файлы static QString mainConfigDir = QFileInfo(json_file).canonicalPath(); modus::module::GroupParams gp; if(group_params) gp = modus::module::GroupParams(group_params); if(!json_file.isEmpty()) { QFile f(json_file); if(!f.open(QIODevice::ReadOnly)) throw SvException(QString("Ошибка при чтении файла модулей '%1': %2") .arg(f.fileName(), f.errorString())); QByteArray json = f.readAll(); f.close(); // заменяем имя переменной %case% в тексте, если в group_params определена case_value if(gp.case_value.isValid()) json.replace(QByteArray("%case%"), gp.case_value.toByteArray()); // теперь парсим измененный json QJsonParseError perr; // QJsonDocument jd = QJsonDocument::fromJson(json, &perr); modus::JsonParser jd = modus::JsonParser::fromJson(json, &perr); if(perr.error != QJsonParseError::NoError) throw SvException(QString("Ошибка разбора файла '%1': %2") .arg(f.fileName(), perr.errorString())); QJsonObject jo = jd.object(); if(!jo.contains(P_MODULES)) throw SvException(QString("Неверный файл конфигурации %1. Отсутствует раздел '%2'.").arg(f.fileName()).arg(P_MODULES)); ja = jo.value(P_MODULES).toArray(); } else if (modules_array) { ja = QJsonArray(*modules_array); } else throw SvException("Неверный вызов функции parse_module_list"); /** в массиве модулей могут содержатся группы со ссылками на файлы. разбираем их и добавляем в modules_list **/ for(QJsonValue v: ja) { if(v.toObject().contains(P_ENABLE) && !v.toObject().value(P_ENABLE).toBool()) continue; if(v.toObject().contains(P_GROUP)) { modus::module::GroupParams gpsub = modus::module::GroupParams(&gp); gpsub.mergeJsonObject(v.toObject()); if(!json_file.isEmpty()) gpsub.file_reference = json_file; if(v.toObject().contains(P_FILE)) { QFileInfo fi(mainConfigDir, v.toObject().value(P_FILE).toString()); if(!fi.exists()) throw SvException(QString("Файл не найден: %1").arg(v.toObject().value(P_FILE).toString())); modus::module::parse_module_list(fi.canonicalFilePath(), nullptr, &gpsub, result); } else if(v.toObject().contains(P_MODULES) && v.toObject().value(P_MODULES).isArray()) { QJsonArray gja = v.toObject().value(P_MODULES).toArray(); modus::module::parse_module_list("", &gja, &gpsub, result); } } else if(v.toObject().contains(P_FILE)) { QFileInfo fi(QFileInfo(json_file).canonicalPath(), v.toObject().value(P_FILE).toString()); if(!fi.exists()) throw SvException(QString("Файл не найден: %1").arg(v.toObject().value(P_FILE).toString())); modus::module::parse_module_list(fi.canonicalFilePath(), nullptr, &gp, result); } else { if(!json_file.isEmpty()) gp.file_reference = json_file; result->append(qMakePair(v, gp)); } } } catch(SvException& e) { // QDir::setCurrent(cur_dir.absolutePath()); throw e; } }