diff --git a/include/ada.h b/include/ada.h index 7c579d95d..30a884fe9 100644 --- a/include/ada.h +++ b/include/ada.h @@ -30,6 +30,7 @@ #include "ada/url_pattern-inl.h" #include "ada/url_pattern_helpers.h" #include "ada/url_pattern_helpers-inl.h" +#include "ada/url_pattern_regex.h" // Public API #include "ada/ada_version.h" diff --git a/include/ada/implementation.h b/include/ada/implementation.h index 33bf67978..117b0ff6b 100644 --- a/include/ada/implementation.h +++ b/include/ada/implementation.h @@ -15,6 +15,7 @@ #include "ada/url.h" #include "ada/state.h" #include "ada/url_aggregator.h" +#include "ada/url_pattern_regex.h" namespace ada { enum class errors : uint8_t { type_error }; @@ -56,12 +57,15 @@ bool can_parse(std::string_view input, * @param input valid UTF-8 string or URLPatternInit struct * @param base_url an optional valid UTF-8 string * @param options an optional url_pattern_options struct + * @param regex_provider an optional regex provider. if not provided, it will + * use ada::url_pattern_regex::std_regex_provider * @return url_pattern instance */ ada_warn_unused tl::expected parse_url_pattern( std::variant input, const std::string_view* base_url = nullptr, - const url_pattern_options* options = nullptr); + const url_pattern_options* options = nullptr, + std::optional regex_provider = std::nullopt); /** * Computes a href string from a file path. The function assumes diff --git a/include/ada/parser.h b/include/ada/parser.h index 80e97decc..60bf69122 100644 --- a/include/ada/parser.h +++ b/include/ada/parser.h @@ -9,6 +9,7 @@ #include #include "ada/expected.h" +#include "ada/url_pattern_regex.h" /** * @private @@ -53,7 +54,8 @@ extern template url parse_url_impl(std::string_view user_input, tl::expected parse_url_pattern_impl( std::variant input, - const std::string_view* base_url, const url_pattern_options* options); + const std::string_view* base_url, const url_pattern_options* options, + url_pattern_regex::provider&& regex_provider); } // namespace ada::parser diff --git a/include/ada/url_pattern.h b/include/ada/url_pattern.h index 4c0b897be..3a5d0fcb4 100644 --- a/include/ada/url_pattern.h +++ b/include/ada/url_pattern.h @@ -7,6 +7,7 @@ #include "ada/implementation.h" #include "ada/expected.h" +#include "ada/url_pattern_regex.h" #include #include @@ -21,7 +22,8 @@ template tl::expected parse_url_pattern_impl( std::variant input, - const std::string_view* base_url, const url_pattern_options* options); + const std::string_view* base_url, const url_pattern_options* options, + url_pattern_regex::provider&& regex_provider); } // Important: C++20 allows us to use concept rather than `using` or `typedef @@ -270,10 +272,8 @@ struct url_pattern_options { // https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API class url_pattern { public: - url_pattern() = default; - explicit url_pattern(std::optional&& input, - std::optional&& base_url, - std::optional&& options); + explicit url_pattern(url_pattern_regex::provider&& regex_provider) + : regex_provider_(std::move(regex_provider)) {} /** * @see https://urlpattern.spec.whatwg.org/#dom-urlpattern-exec @@ -328,12 +328,14 @@ class url_pattern { url_pattern_component search_component{}; url_pattern_component hash_component{}; bool ignore_case_ = false; + url_pattern_regex::provider regex_provider_; template friend tl::expected parser::parse_url_pattern_impl( std::variant input, - const std::string_view* base_url, const url_pattern_options* options); + const std::string_view* base_url, const url_pattern_options* options, + url_pattern_regex::provider&& regex_provider); }; } // namespace ada diff --git a/include/ada/url_pattern_regex.h b/include/ada/url_pattern_regex.h new file mode 100644 index 000000000..725efd8fc --- /dev/null +++ b/include/ada/url_pattern_regex.h @@ -0,0 +1,27 @@ +/** + * @file url_search_params.h + * @brief Declaration for the URL Search Params + */ +#ifndef ADA_URL_PATTERN_REGEX_H +#define ADA_URL_PATTERN_REGEX_H + +#include + +namespace ada::url_pattern_regex { + +class provider { + struct type {}; + + std::optional create_regex_instance(std::string_view pattern, + bool ignore_case); + + std::optional> regex_search(std::string_view input, std::string_view pattern); +}; + +class std_regex_provider : public provider { + +}; + +} // namespace ada::url_pattern_regex + +#endif // ADA_URL_PATTERN_REGEX_H diff --git a/src/ada.cpp b/src/ada.cpp index 3d35569dd..36c66f2d9 100644 --- a/src/ada.cpp +++ b/src/ada.cpp @@ -10,4 +10,5 @@ #include "url_aggregator.cpp" #include "url_pattern.cpp" #include "url_pattern_helpers.cpp" +#include "url_pattern_regex.cpp" #include "ada_c.cpp" diff --git a/src/implementation.cpp b/src/implementation.cpp index cad5af5ff..14476f5c9 100644 --- a/src/implementation.cpp +++ b/src/implementation.cpp @@ -81,8 +81,11 @@ ada_warn_unused std::string to_string(ada::encoding_type type) { ada_warn_unused tl::expected parse_url_pattern( std::variant input, - const std::string_view* base_url, const url_pattern_options* options) { - return parser::parse_url_pattern_impl(std::move(input), base_url, options); + const std::string_view* base_url, const url_pattern_options* options, + std::optional regex_provider) { + return parser::parse_url_pattern_impl( + std::move(input), base_url, options, + regex_provider.value_or(url_pattern_regex::std_regex_provider())); } } // namespace ada diff --git a/src/parser.cpp b/src/parser.cpp index 09c6ad283..31a283019 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -900,7 +900,8 @@ result_type parse_url_impl(std::string_view user_input, tl::expected parse_url_pattern_impl( std::variant input, - const std::string_view* base_url, const url_pattern_options* options) { + const std::string_view* base_url, const url_pattern_options* options, + url_pattern_regex::provider&& regex_provider) { // Let init be null. url_pattern_init init; @@ -983,7 +984,7 @@ tl::expected parse_url_pattern_impl( } // Let urlPattern be a new URL pattern. - auto url_pattern_ = url_pattern{}; + auto url_pattern_ = url_pattern(std::move(regex_provider)); // Set urlPattern’s protocol component to the result of compiling a component // given processedInit["protocol"], canonicalize a protocol, and default diff --git a/src/url_pattern_regex.cpp b/src/url_pattern_regex.cpp new file mode 100644 index 000000000..e69de29bb