69 lines
1.9 KiB
C++
69 lines
1.9 KiB
C++
#ifndef OSRM_BINDINGS_NODE_JSON_V8_RENDERER_HPP
|
|
#define OSRM_BINDINGS_NODE_JSON_V8_RENDERER_HPP
|
|
|
|
#include "osrm/json_container.hpp"
|
|
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
#include <nan.h>
|
|
#pragma GCC diagnostic pop
|
|
|
|
#include <functional>
|
|
|
|
namespace node_osrm
|
|
{
|
|
|
|
struct V8Renderer
|
|
{
|
|
explicit V8Renderer(v8::Local<v8::Value> &_out) : out(_out) {}
|
|
|
|
void operator()(const osrm::json::String &string) const
|
|
{
|
|
out = Nan::New(std::cref(string.value)).ToLocalChecked();
|
|
}
|
|
|
|
void operator()(const osrm::json::Number &number) const { out = Nan::New(number.value); }
|
|
|
|
void operator()(const osrm::json::Object &object) const
|
|
{
|
|
v8::Local<v8::Object> obj = Nan::New<v8::Object>();
|
|
for (const auto &keyValue : object.values)
|
|
{
|
|
v8::Local<v8::Value> child;
|
|
mapbox::util::apply_visitor(V8Renderer(child), keyValue.second);
|
|
Nan::Set(obj, Nan::New(keyValue.first).ToLocalChecked(), child);
|
|
}
|
|
out = obj;
|
|
}
|
|
|
|
void operator()(const osrm::json::Array &array) const
|
|
{
|
|
v8::Local<v8::Array> a = Nan::New<v8::Array>(array.values.size());
|
|
for (auto i = 0u; i < array.values.size(); ++i)
|
|
{
|
|
v8::Local<v8::Value> child;
|
|
mapbox::util::apply_visitor(V8Renderer(child), array.values[i]);
|
|
Nan::Set(a, i, child);
|
|
}
|
|
out = a;
|
|
}
|
|
|
|
void operator()(const osrm::json::True &) const { out = Nan::New(true); }
|
|
|
|
void operator()(const osrm::json::False &) const { out = Nan::New(false); }
|
|
|
|
void operator()(const osrm::json::Null &) const { out = Nan::Null(); }
|
|
|
|
private:
|
|
v8::Local<v8::Value> &out;
|
|
};
|
|
|
|
inline void renderToV8(v8::Local<v8::Value> &out, const osrm::json::Object &object)
|
|
{
|
|
V8Renderer renderer(out);
|
|
renderer(object);
|
|
}
|
|
} // namespace node_osrm
|
|
|
|
#endif // JSON_V8_RENDERER_HPP
|