Files
whetstone_DSL/editor/src/Phase30aIntegration.h

81 lines
2.4 KiB
C++

#pragma once
// Step 558: Phase 30a Integration
#include <string>
#include <vector>
#include "DebugSessionModel.h"
#include "BreakpointSystem.h"
#include "StepEngine.h"
#include "ExceptionStackTraceCapture.h"
struct Phase30aRequest {
std::string targetId;
std::string bufferId;
std::string executablePath;
std::string breakpointId;
int breakpointLine = 0;
bool triggerCondition = true;
std::string stepCommand;
bool triggerException = false;
};
struct Phase30aResult {
bool pass = false;
bool breakpointHit = false;
StepResult stepResult;
ExceptionCaptureResult exceptionResult;
std::vector<std::string> errors;
};
class Phase30aIntegration {
public:
static Phase30aResult run(const Phase30aRequest& request) {
Phase30aResult out;
DebugSessionModel session;
if (!session.start(request.targetId, request.bufferId, request.executablePath)) {
out.errors.push_back("session_start_failed");
return out;
}
BreakpointSystem breakpoints;
if (!breakpoints.addConditionalBreakpoint(request.breakpointId,
request.bufferId,
request.breakpointLine,
"runtime_condition")) {
out.errors.push_back("breakpoint_add_failed");
return out;
}
out.breakpointHit = breakpoints.shouldBreak(request.breakpointId, request.triggerCondition);
if (!out.breakpointHit) {
out.errors.push_back("breakpoint_not_hit");
return out;
}
StepEngine engine;
out.stepResult = engine.execute(request.stepCommand);
if (!out.stepResult.ok) {
out.errors.push_back("step_failed");
return out;
}
if (request.triggerException) {
out.exceptionResult = ExceptionStackTraceCapture::capture(
"RuntimeError",
"simulated exception",
"thread-main",
{{"run", request.bufferId, request.breakpointLine, ""},
{"dispatch", request.bufferId, request.breakpointLine + 1, ""}});
if (!out.exceptionResult.valid) {
out.errors.push_back("exception_capture_failed");
return out;
}
}
out.pass = true;
return out;
}
};