#pragma once #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wshadow" #include #pragma GCC diagnostic pop #include #include #include namespace mbgl { namespace style { namespace conversion { inline bool isUndefined(v8::Local value) { Nan::HandleScope scope; return value->IsUndefined() || value->IsNull(); } inline bool isArray(v8::Local value) { Nan::HandleScope scope; return value->IsArray(); } inline std::size_t arrayLength(v8::Local value) { Nan::HandleScope scope; return value.As()->Length(); } inline v8::Local arrayMember(v8::Local value, std::size_t i) { Nan::EscapableHandleScope scope; return scope.Escape(Nan::Get(value.As(), i).ToLocalChecked()); } inline bool isObject(v8::Local value) { Nan::HandleScope scope; return value->IsObject() && !value->IsArray(); } inline optional> objectMember(v8::Local value, const char * name) { Nan::EscapableHandleScope scope; if (!Nan::Has(Nan::To(value).ToLocalChecked(), Nan::New(name).ToLocalChecked()).FromJust()) { return {}; } Nan::MaybeLocal result = Nan::Get(Nan::To(value).ToLocalChecked(), Nan::New(name).ToLocalChecked()); if (result.IsEmpty()) { return {}; } return scope.Escape(result.ToLocalChecked()); } template optional eachMember(v8::Local value, Fn&& fn) { Nan::HandleScope scope; v8::Local names = Nan::GetOwnPropertyNames(Nan::To(value).ToLocalChecked()).ToLocalChecked(); for (uint32_t i = 0; i < names->Length(); ++i) { v8::Local k = Nan::Get(names, i).ToLocalChecked(); v8::Local v = Nan::Get(Nan::To(value).ToLocalChecked(), k).ToLocalChecked(); optional result = fn(*Nan::Utf8String(k), v); if (result) { return result; } } return {}; } inline optional toBool(v8::Local value) { Nan::HandleScope scope; if (!value->IsBoolean()) { return {}; } return value->BooleanValue(); } inline optional toNumber(v8::Local value) { Nan::HandleScope scope; if (!value->IsNumber()) { return {}; } return value->NumberValue(); } inline optional toDouble(v8::Local value) { Nan::HandleScope scope; if (!value->IsNumber()) { return {}; } return value->NumberValue(); } inline optional toString(v8::Local value) { Nan::HandleScope scope; if (!value->IsString()) { return {}; } return std::string(*Nan::Utf8String(value)); } inline optional toValue(v8::Local value) { if (value->IsFalse()) { return { false }; } else if (value->IsTrue()) { return { true }; } else if (value->IsString()) { return { std::string(*Nan::Utf8String(value)) }; } else if (value->IsUint32()) { return { std::uint64_t(value->Uint32Value()) }; } else if (value->IsInt32()) { return { std::int64_t(value->Int32Value()) }; } else if (value->IsNumber()) { return { value->NumberValue() }; } else { return {}; } } } // namespace conversion } // namespace style } // namespace mbgl