#include "actions.hpp" #include "json.hpp" #include "vm_provider.hpp" #include #include #include using namespace sliger::rpc::action; auto Status::perform_action( std::unique_ptr writer, VmProvider& vm) -> void { bool running = not vm.done(); writer->write(std::format( "{{ \"ok\": true, \"status\": {{ \"running\": {} }} }}", running)); writer->flush(); }; auto FlameGraph::perform_action( std::unique_ptr writer, VmProvider& vm) -> void { auto json = vm.flame_graph_json(); if (json) { writer->write(std::format( "{{ \"ok\": true, \"flameGraph\": {} }}", json.value())); } else { writer->write("{ \"ok\": false }"); } writer->flush(); }; auto CodeCoverage::perform_action( std::unique_ptr writer, VmProvider& vm) -> void { auto json = vm.code_coverage_json(); if (json) { writer->write(std::format( "{{ \"ok\": true, \"codeCoverage\": {} }}", json.value())); } else { writer->write("{ \"ok\": false }"); } writer->flush(); }; auto RunDebug::perform_action( std::unique_ptr writer, VmProvider& vm) -> void { auto program = this->instructions; vm.load_and_start(program); writer->write("{ \"ok\": true }"); writer->flush(); }; auto sliger::rpc::action::action_from_json( const sliger::json::Value& value) -> std::unique_ptr { auto& obj = value.as(); auto type = obj.fields.at("type")->as(); if (type.value == "status") { return std::make_unique(); } if (type.value == "flame-graph") { return std::make_unique(); } if (type.value == "code-coverage") { return std::make_unique(); } if (type.value == "run-debug") { sliger::json::ArrayValues values = std::move( obj.fields.at("program")->as().values); auto instructions = std::vector(); for (auto&& v : values) { auto value = v->as().value; instructions.push_back((uint32_t)value); } return std::make_unique(instructions); } std::cout << "error: TODO " << __FILE__ << ":" << __LINE__ << "\n"; exit(1); };