slige/runtime/main.cpp

85 lines
2.5 KiB
C++

#include "actions.hpp"
#include "json.hpp"
#include "rpc_server.hpp"
#include "vm.hpp"
#include "vm_provider.hpp"
#include <cstdint>
#include <cstdlib>
#include <format>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
int execute_file_and_exit(std::string filename, bool print_debug)
{
auto file = std::ifstream();
file.open(filename.c_str());
if (!file) {
std::cout << std::format("error: could not open file '{}'\n", filename);
return 1;
}
auto text = std::string(std::istreambuf_iterator<char> { file }, {});
auto parsed = sliger::json::parse_json(text);
if (not parsed.ok()) {
std::cout << std::format("error: {} at {}:{}\n", parsed.err().msg,
parsed.err().pos.line, parsed.err().pos.col);
return 1;
}
auto program = std::vector<uint32_t>();
for (auto& v : parsed.val()->as<sliger::json::Array>().values) {
program.push_back(
static_cast<uint32_t>(v->as<sliger::json::Number>().value));
}
auto vm = sliger::VM(program,
{
.flame_graph = false,
.code_coverage = false,
.print_debug = print_debug,
});
vm.run_until_done();
return 0;
}
int main(int argc, char** argv)
{
if (argc >= 3 && std::string(argv[1]) == "run") {
auto filename = std::string();
bool print_debug = false;
for (int i = 2; i < argc; ++i) {
auto arg = std::string(argv[i]);
if (arg == "--print-debug") {
print_debug = true;
} else {
if (!filename.empty()) {
std::cerr << std::format("error: >1 files specified\n");
std::exit(1);
}
filename = arg;
}
}
if (filename.empty()) {
std::cerr << std::format("error: no file specified\n");
std::exit(1);
}
return execute_file_and_exit(argv[2], print_debug);
}
auto vm_provider = sliger::rpc::VmProvider();
auto rpc = sliger::rpc::RpcServer(
[&](std::unique_ptr<sliger::json::Value> req,
std::unique_ptr<sliger::rpc::BufferedWriter> writer) {
auto action = sliger::rpc::action::action_from_json(*req);
action->perform_action(std::move(writer), vm_provider);
});
std::cout << "Runtime at 127.0.0.1:13370\n";
auto res = rpc.listen();
if (!res.is_ok()) {
std::cout << res.err().msg << "\n";
}
}