From b3edf4e419eec56321e481e145b73b5cb853aee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Sat, 30 May 2026 09:56:13 +0200 Subject: [PATCH] url: refactor URLPattern::{Exec,Test} MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor these `URLPattern` methods and extract common logic into a helper function, reducing code duplication. Signed-off-by: Tobias Nießen --- src/node_url_pattern.cc | 84 ++++++++++++++++------------------------- src/node_url_pattern.h | 2 +- 2 files changed, 33 insertions(+), 53 deletions(-) diff --git a/src/node_url_pattern.cc b/src/node_url_pattern.cc index 571413b47da12d..784cfdc9eb0a1e 100644 --- a/src/node_url_pattern.cc +++ b/src/node_url_pattern.cc @@ -60,8 +60,10 @@ using v8::FunctionCallbackInfo; using v8::FunctionTemplate; using v8::Global; using v8::Isolate; +using v8::Just; using v8::Local; using v8::LocalVector; +using v8::Maybe; using v8::MaybeLocal; using v8::Name; using v8::NewStringType; @@ -556,25 +558,31 @@ MaybeLocal URLPattern::Exec(Environment* env, } return Null(env->isolate()); } + THROW_ERR_OPERATION_FAILED(env, "Failed to exec URLPattern"); return {}; } -bool URLPattern::Test(Environment* env, - const ada::url_pattern_input& input, - std::optional& baseURL) { +Maybe URLPattern::Test(Environment* env, + const ada::url_pattern_input& input, + std::optional& baseURL) { if (auto result = url_pattern_.test(input, baseURL ? &*baseURL : nullptr)) { - return *result; + return Just(*result); } THROW_ERR_OPERATION_FAILED(env, "Failed to test URLPattern"); - return false; + return {}; } -// V8 Methods - -void URLPattern::Exec(const FunctionCallbackInfo& args) { +namespace { +template &)> +void ExecOrTest(const FunctionCallbackInfo& args) { URLPattern* url_pattern; ASSIGN_OR_RETURN_UNWRAP(&url_pattern, args.This()); - auto env = Environment::GetCurrent(args); + Environment* env = Environment::GetCurrent(args); ada::url_pattern_input input; std::optional baseURL{}; @@ -586,7 +594,8 @@ void URLPattern::Exec(const FunctionCallbackInfo& args) { input_base = input_value.ToString(); input = std::string_view(input_base); } else if (args[0]->IsObject()) { - auto maybeInput = URLPatternInit::FromJsObject(env, args[0].As()); + auto maybeInput = + URLPattern::URLPatternInit::FromJsObject(env, args[0].As()); if (!maybeInput.has_value()) return; input = std::move(*maybeInput); } else { @@ -607,55 +616,26 @@ void URLPattern::Exec(const FunctionCallbackInfo& args) { } } - Local result; std::optional baseURL_opt = baseURL ? std::optional(*baseURL) : std::nullopt; - if (!url_pattern->Exec(env, input, baseURL_opt).ToLocal(&result)) { - THROW_ERR_OPERATION_FAILED(env, "Failed to exec URLPattern"); - return; + R result{}; + if (((url_pattern->*func)(env, input, baseURL_opt).*to_r)(&result)) { + args.GetReturnValue().Set(result); } - args.GetReturnValue().Set(result); } +} // namespace -void URLPattern::Test(const FunctionCallbackInfo& args) { - URLPattern* url_pattern; - ASSIGN_OR_RETURN_UNWRAP(&url_pattern, args.This()); - auto env = Environment::GetCurrent(args); - - ada::url_pattern_input input; - std::optional baseURL{}; - std::string input_base; - if (args.Length() == 0 || args[0]->IsNullOrUndefined()) { - input = ada::url_pattern_init{}; - } else if (args[0]->IsString()) { - Utf8Value input_value(env->isolate(), args[0].As()); - input_base = input_value.ToString(); - input = std::string_view(input_base); - } else if (args[0]->IsObject()) { - auto maybeInput = URLPatternInit::FromJsObject(env, args[0].As()); - if (!maybeInput.has_value()) return; - input = std::move(*maybeInput); - } else { - THROW_ERR_INVALID_ARG_TYPE( - env, "URLPattern input needs to be a string or an object"); - return; - } +// V8 Methods - if (args.Length() > 1 && !args[1]->IsUndefined()) { - if (args[1]->IsNull()) { - baseURL = std::string("null"); - } else if (args[1]->IsString()) { - Utf8Value base_url_value(env->isolate(), args[1].As()); - baseURL = base_url_value.ToStringView(); - } else { - THROW_ERR_INVALID_ARG_TYPE(env, "baseURL must be a string"); - return; - } - } +void URLPattern::Exec(const FunctionCallbackInfo& args) { + ExecOrTest, + MaybeLocal, + &MaybeLocal::ToLocal, + &URLPattern::Exec>(args); +} - std::optional baseURL_opt = - baseURL ? std::optional(*baseURL) : std::nullopt; - args.GetReturnValue().Set(url_pattern->Test(env, input, baseURL_opt)); +void URLPattern::Test(const FunctionCallbackInfo& args) { + ExecOrTest, &Maybe::To, &URLPattern::Test>(args); } #define URL_PATTERN_COMPONENT_GETTERS(uppercase_name, lowercase_name) \ diff --git a/src/node_url_pattern.h b/src/node_url_pattern.h index 48f3956cb74458..3c4593225ce2ee 100644 --- a/src/node_url_pattern.h +++ b/src/node_url_pattern.h @@ -102,7 +102,7 @@ class URLPattern : public BaseObject { Environment* env, const ada::url_pattern_input& input, std::optional& baseURL); // NOLINT (runtime/references) - bool Test( + v8::Maybe Test( Environment* env, const ada::url_pattern_input& input, std::optional& baseURL); // NOLINT (runtime/references)