in src/maluuba/speech/nodejs/fuzzymatcher.hpp [255:317]
static void New(const v8::FunctionCallbackInfo<v8::Value>& args)
{
auto isolate = args.GetIsolate();
if (args.IsConstructCall()) {
if (args.Length() < 2) {
isolate->ThrowException(v8::Exception::TypeError(
v8::String::NewFromUtf8(isolate, "Expected at least 2 arguments.")));
return;
}
if (!args[0]->IsArray()) {
isolate->ThrowException(v8::Exception::TypeError(
v8::String::NewFromUtf8(isolate, "Expected 'targets' argument to be an Object[].")));
return;
}
v8::Local<v8::Function> arg_extract{};
if (args.Length() > 2) {
if (!args[2]->IsFunction()) {
isolate->ThrowException(v8::Exception::TypeError(
v8::String::NewFromUtf8(isolate, "Expected 'extract' argument to be a Function.")));
return;
}
arg_extract = args[2].As<v8::Function>();
}
auto arg_targets = args[0].As<v8::Array>();
auto arg_distance = args[1];
try {
// Attempt to see if the JS calls can be unwrapped into their native components
// to save on overhead on the distance calls, which can occur a lot.
if (EnHybridDistance::type(isolate)->HasInstance(arg_distance)) {
auto obj = make_fuzzy_matcher_hybrid(isolate, arg_targets, arg_distance, arg_extract);
obj->Wrap(args.This());
} else if (StringDistance::type(isolate)->HasInstance(arg_distance)) {
auto obj = make_fuzzy_matcher_string(isolate, arg_targets, arg_distance, arg_extract);
obj->Wrap(args.This());
} else if (EnPhoneticDistance::type(isolate)->HasInstance(arg_distance)) {
auto obj = make_fuzzy_matcher_phone(isolate, arg_targets, arg_distance, arg_extract);
obj->Wrap(args.This());
} else {
// User provided JS distance function.
if (!arg_distance->IsFunction()) {
isolate->ThrowException(v8::Exception::TypeError(
v8::String::NewFromUtf8(isolate, "Expected 'distance' argument to be a Function.")));
return;
}
auto obj = make_fuzzy_matcher_js(isolate, arg_targets, arg_distance, arg_extract);
obj->Wrap(args.This());
}
args.GetReturnValue().Set(args.This());
} catch (const std::exception& e) {
isolate->ThrowException(v8::Exception::TypeError(
v8::String::NewFromUtf8(isolate, e.what())));
return;
}
} else {
isolate->ThrowException(v8::Exception::SyntaxError(
v8::String::NewFromUtf8(isolate, "Not invoked as constructor, use `new`.")));
return;
}
}