1
+ /* *
2
+ * @file url_pattern.h
3
+ * @brief Declaration for the URLPattern implementation.
4
+ */
5
+ #ifndef ADA_URL_PATTERN_H
6
+ #define ADA_URL_PATTERN_H
7
+
8
+ #include < string>
9
+ #include < unordered_map>
10
+
11
+ namespace ada {
12
+
13
+ // URLPattern is a Web Platform standard API for matching URLs against a
14
+ // pattern syntax (think of it as a regular expression for URLs). It is
15
+ // defined in https://wicg.github.io/urlpattern.
16
+ // More information about the URL Pattern syntax can be found at
17
+ // https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API
18
+ class URLPattern {
19
+ public:
20
+ class Component {
21
+ public:
22
+ explicit Component (std::string_view pattern, std::string_view regex,
23
+ const std::vector<std::string>& names);
24
+
25
+ // TODO(anonrig): Move these implementations to `url_pattern-inl.h`
26
+ std::string_view get_pattern () const noexcept ada_lifetime_bound {
27
+ return pattern;
28
+ }
29
+ std::string_view get_regex () const noexcept ada_lifetime_bound {
30
+ return regex;
31
+ }
32
+ const std::vector<std::string>& get_names () const noexcept
33
+ ada_lifetime_bound {
34
+ return names;
35
+ }
36
+
37
+ private:
38
+ // Disallow copy.
39
+ Component (const Component&);
40
+
41
+ // The normalized pattern for this component.
42
+ std::string pattern = " " ;
43
+ // The generated JavaScript regular expression for this component.
44
+ std::string regex = " " ;
45
+ // The list of sub-component names extracted for this component.
46
+ std::vector<std::string> names;
47
+ };
48
+
49
+ // A structure providing matching patterns for individual components
50
+ // of a URL. When a URLPattern is created, or when a URLPattern is
51
+ // used to match or test against a URL, the input can be given as
52
+ // either a string or a URLPatternInit struct. If a string is given,
53
+ // it will be parsed to create a URLPatternInit. The URLPatternInit
54
+ // API is defined as part of the URLPattern specification.
55
+ struct Init {
56
+ std::optional<std::string> protocol;
57
+ std::optional<std::string> username;
58
+ std::optional<std::string> password;
59
+ std::optional<std::string> hostname;
60
+ std::optional<std::string> port;
61
+ std::optional<std::string> pathname;
62
+ std::optional<std::string> search;
63
+ std::optional<std::string> hash;
64
+
65
+ std::optional<std::string> base_url;
66
+ };
67
+
68
+ using Input = std::variant<std::string, Init>;
69
+
70
+ // A struct providing the URLPattern matching results for a single
71
+ // URL component. The URLPatternComponentResult is only ever used
72
+ // as a member attribute of a URLPatternResult struct. The
73
+ // URLPatternComponentResult API is defined as part of the URLPattern
74
+ // specification.
75
+ struct ComponentResult {
76
+ std::string input;
77
+ std::unordered_map<std::string, std::string> groups;
78
+ };
79
+
80
+ // A struct providing the URLPattern matching results for all
81
+ // components of a URL. The URLPatternResult API is defined as
82
+ // part of the URLPattern specification.
83
+ struct Result {
84
+ std::vector<Input> inputs;
85
+ ComponentResult protocol;
86
+ ComponentResult username;
87
+ ComponentResult password;
88
+ ComponentResult hostname;
89
+ ComponentResult port;
90
+ ComponentResult pathname;
91
+ ComponentResult search;
92
+ ComponentResult hash;
93
+ };
94
+
95
+ struct Options {
96
+ bool ignore_case = false ;
97
+ };
98
+
99
+ explicit URLPattern (std::optional<Input> input,
100
+ std::optional<std::string_view> base_url,
101
+ std::optional<Options> options);
102
+
103
+ std::optional<Result> exec (std::optional<Input> input,
104
+ std::optional<std::string> base_url);
105
+ bool test (std::optional<Input> input,
106
+ std::optional<std::string_view> base_url);
107
+
108
+ // TODO(anonrig): Move these to `url_pattern-inl.h`.
109
+ const Component& get_protocol () const ada_lifetime_bound { return protocol; }
110
+ const Component& get_username () const ada_lifetime_bound { return username; }
111
+ const Component& get_password () const ada_lifetime_bound { return password; }
112
+ const Component& get_port () const ada_lifetime_bound { return port; }
113
+ const Component& get_pathname () const ada_lifetime_bound { return pathname; }
114
+ const Component& get_search () const ada_lifetime_bound { return search; }
115
+ const Component& get_hash () const ada_lifetime_bound { return hash; }
116
+
117
+ // If ignoreCase is true, the JavaScript regular expression created for each
118
+ // pattern must use the `vi` flag. Otherwise, they must use the `v` flag.
119
+ // TODO(anonrig): Move these to `url_pattern-inl.h`.
120
+ bool case_ignored () const ada_lifetime_bound { return ignore_case; }
121
+
122
+ private:
123
+ Component protocol;
124
+ Component username;
125
+ Component password;
126
+ Component port;
127
+ Component pathname;
128
+ Component search;
129
+ Component hash;
130
+ bool ignore_case = false ;
131
+ };
132
+
133
+ } // namespace ada
134
+
135
+ #endif
0 commit comments