Files
cmake-vsenv/read_config.cpp
2026-02-26 22:40:23 +08:00

118 lines
4.0 KiB
C++

#include "read_config.h"
#include <fstream>
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
ReadConfig::ReadConfig()
{
}
bool ReadConfig::Read(CmdInfo& info, ActionType type, const std::string& path)
{
try {
// 1. 读取JSON文件
std::ifstream file(path);
if (!file.is_open()) {
std::cerr << "Error: Cannot open config file: " << path << std::endl;
return false;
}
// 2. 解析JSON
json j;
file >> j;
// 3. 检查必须的键
if (!j.contains("vsbat") || !j["vsbat"].is_string()) {
std::cerr << "Error: Missing or invalid 'vsbat' field" << std::endl;
return false;
}
// 定义固定配置键
const std::vector<std::string> requiredKeys = {"Debug", "Release"};
// 检查所有必须的键是否存在
for (const auto& key : requiredKeys) {
if (!j.contains(key) || !j[key].is_array()) {
std::cerr << "Error: Missing or invalid '" << key << "' field" << std::endl;
return false;
}
}
// 4. 清空之前的数据
info.data.clear();
// 5. 读取vsbat路径
info.vsbat = j["vsbat"].get<std::string>();
// 6. 读取Debug和Release配置
for (const auto& key : requiredKeys) {
std::vector<CMakeCmd> cmds;
for (const auto& cmd_item : j[key]) {
// 验证命令对象结构
if (!cmd_item.is_object() || !cmd_item.contains("type") || !cmd_item["type"].is_string()) {
std::cerr << "Error: Invalid command object in '" << key << "'" << std::endl;
return false;
}
std::string cmd_type_str = cmd_item["type"].get<std::string>();
if (cmd_type_str != "config" && cmd_type_str != "build" && cmd_type_str != "clear") {
std::cerr << "Error: Invalid command type '" << cmd_type_str << "' in '" << key
<< "'. Must be 'config' or 'build'." << std::endl;
return false;
}
CMakeCmd cmd;
cmd.type = GetType(cmd_type_str);
// 修改:从读取单个字符串改为读取字符串数组
if (cmd_item.contains("args") && cmd_item["args"].is_array()) {
// 新格式:使用 args 数组
for (const auto& arg_item : cmd_item["args"]) {
if (arg_item.is_string()) {
cmd.args.push_back(arg_item.get<std::string>());
} else {
std::cerr << "Error: Invalid argument type in 'args' array" << std::endl;
return false;
}
}
} else if (cmd_item.contains("arg") && cmd_item["arg"].is_string()) {
// 向后兼容:支持旧的单字符串格式
cmd.args.push_back(cmd_item["arg"].get<std::string>());
} else {
std::cerr << "Error: Missing or invalid 'args' or 'arg' field in command" << std::endl;
return false;
}
if (cmd.type == type) {
cmds.push_back(cmd);
}
}
info.data[key] = cmds;
}
return true;
} catch (const json::exception& e) {
std::cerr << "JSON parsing error: " << e.what() << std::endl;
return false;
} catch (const std::exception& e) {
std::cerr << "Error reading config file: " << e.what() << std::endl;
return false;
}
}
ActionType ReadConfig::GetType(const std::string& action)
{
if (action == "Config" || action == "config") {
return ActionType::CT_CONFIG;
} else if (action == "Build" || action == "build") {
return ActionType::CT_BUILD;
} else {
return ActionType::CT_CLEAR;
}
}