static void New()

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;
      }
    }