Files
whetstone_DSL/editor/src/ProjectManager.h
2026-02-09 12:52:20 -07:00

65 lines
1.8 KiB
C++

#pragma once
// Step 116: Project save/load helpers
#include <string>
#include <vector>
#include <memory>
#include <nlohmann/json.hpp>
#include "ast/Serialization.h"
#include "ast/Module.h"
struct ProjectBufferInfo {
std::string path;
std::string language;
std::string mode;
};
struct ProjectFile {
std::string workspaceRoot;
std::string activePath;
std::vector<ProjectBufferInfo> buffers;
std::unique_ptr<Module> ast;
};
inline nlohmann::json projectToJson(const ProjectFile& project) {
nlohmann::json j;
j["workspaceRoot"] = project.workspaceRoot;
j["activePath"] = project.activePath;
j["buffers"] = nlohmann::json::array();
for (const auto& b : project.buffers) {
j["buffers"].push_back({
{"path", b.path},
{"language", b.language},
{"mode", b.mode}
});
}
if (project.ast) {
j["ast"] = toJson(project.ast.get());
}
return j;
}
inline ProjectFile projectFromJson(const nlohmann::json& j) {
ProjectFile project;
project.workspaceRoot = j.value("workspaceRoot", "");
project.activePath = j.value("activePath", "");
if (j.contains("buffers") && j["buffers"].is_array()) {
for (const auto& item : j["buffers"]) {
ProjectBufferInfo info;
info.path = item.value("path", "");
info.language = item.value("language", "");
info.mode = item.value("mode", "structured");
if (!info.path.empty()) project.buffers.push_back(std::move(info));
}
}
if (j.contains("ast")) {
ASTNode* node = fromJson(j["ast"]);
if (node && node->conceptType == "Module") {
project.ast.reset(static_cast<Module*>(node));
} else {
deleteTree(node);
}
}
return project;
}