AngelscriptLanguageServer/server/src/src/Database.cpp

73 lines
2.7 KiB
C++

#include "Database.hpp"
#include <sstream>
#include "../angelscript/extensions/scriptarray/scriptarray.h"
Napi::Object Database::Init(Napi::Env env, Napi::Object exports) {
Napi::Function func =
DefineClass(env, "Database",
{InstanceMethod("reset", &Database::Reset), InstanceMethod("loadScript", &Database::LoadScript),
InstanceMethod("build", &Database::Build), InstanceMethod("messages", &Database::GetMessages),
InstanceMethod("setEngineProperty", &Database::SetEngineProperty)});
auto* constructor = new Napi::FunctionReference();
*constructor = Napi::Persistent(func);
env.SetInstanceData(constructor);
exports.Set("Database", func);
return exports;
}
void Database::MessageCallback(const asSMessageInfo* msg) {
_messages.push_back(new Diagnostic(msg->section, msg->row, msg->col, msg->type, msg->message));
}
Database::Database(const Napi::CallbackInfo& info) : ObjectWrap(info) {
_engine = asCreateScriptEngine();
_engine->SetMessageCallback(asMETHOD(Database, MessageCallback), this, asCALL_THISCALL);
RegisterStdString(_engine);
RegisterScriptArray(_engine, true);
Reset(info);
}
void Database::SetEngineProperty(const Napi::CallbackInfo& info) {
auto property = info[0].As<Napi::Number>().Int32Value();
auto value = info[1].As<Napi::Number>().Int32Value();
_engine->SetEngineProperty(static_cast<asEEngineProp>(property), value);
}
void Database::Reset(const Napi::CallbackInfo&) {
_engine->DiscardModule("Module");
_builder.StartNewModule(_engine, "Module");
}
void Database::LoadScript(const Napi::CallbackInfo& info) {
if (info.Length() < 2)
throw std::logic_error("Not enough arguments");
auto name = info[0].As<Napi::String>().Utf8Value();
auto script = info[1].As<Napi::String>().Utf8Value();
_builder.AddSectionFromMemory(name.c_str(), script.c_str());
}
Napi::Value Database::Build(const Napi::CallbackInfo& info) {
_messages.clear();
_builder.BuildModule();
return Napi::Number::New(info.Env(), 0);
}
Napi::Value Database::GetMessages(const Napi::CallbackInfo& info) {
auto messages = Napi::Array::New(info.Env());
for (auto msg : _messages) {
auto obj = Napi::Object::New(info.Env());
obj.Set("section", Napi::String::New(info.Env(), msg->GetSection()));
obj.Set("row", Napi::Number::New(info.Env(), msg->GetRow()));
obj.Set("col", Napi::Number::New(info.Env(), msg->GetCol()));
obj.Set("type", Napi::Number::New(info.Env(), msg->GetType()));
obj.Set("message", Napi::String::New(info.Env(), msg->GetMessage()));
messages[messages.Length()] = obj;
}
return messages;
}