Skip to content

Commit 62d73ff

Browse files
committed
feat: add url_search_params to ada
1 parent 81ca729 commit 62d73ff

File tree

8 files changed

+218
-1
lines changed

8 files changed

+218
-1
lines changed

include/ada.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include "ada/url_components.h"
2424
#include "ada/url_aggregator.h"
2525
#include "ada/url_aggregator-inl.h"
26+
#include "ada/url_search_params.h"
27+
#include "ada/url_search_params-inl.h"
2628

2729
// Public API
2830
#include "ada/ada_version.h"

include/ada/url_search_params-inl.h

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* @file url_search_params-inl.h
3+
* @brief Inline declarations for the URL Search Params
4+
*/
5+
#ifndef ADA_URL_SEARCH_PARAMS_INL_H
6+
#define ADA_URL_SEARCH_PARAMS_INL_H
7+
8+
#include "ada.h"
9+
#include "ada/url_search_params.h"
10+
11+
#include <algorithm>
12+
#include <optional>
13+
#include <string>
14+
#include <string_view>
15+
#include <vector>
16+
17+
namespace ada {
18+
19+
inline void url_search_params::append(const std::string_view key,
20+
const std::string_view value) {
21+
params.emplace_back(std::string(key), std::string(value));
22+
}
23+
24+
inline size_t url_search_params::get_size() const noexcept {
25+
return params.size();
26+
}
27+
28+
inline std::optional<std::string_view> url_search_params::get(
29+
const std::string_view key) {
30+
auto entry = std::find_if(params.begin(), params.end(), [&key](auto param) {
31+
return std::get<0>(param) == key;
32+
});
33+
34+
if (entry == params.end()) {
35+
return std::nullopt;
36+
}
37+
38+
return std::get<1>(*entry);
39+
}
40+
41+
inline std::vector<std::string> url_search_params::get_all(
42+
const std::string_view key) {
43+
std::vector<std::string> out{};
44+
45+
for (auto& param : params) {
46+
if (std::get<0>(param) == key) {
47+
out.emplace_back(std::get<1>(param));
48+
}
49+
}
50+
51+
return out;
52+
}
53+
54+
inline bool url_search_params::has(const std::string_view key) noexcept {
55+
auto entry = std::find_if(params.begin(), params.end(), [&key](auto param) {
56+
return std::get<0>(param) == key;
57+
});
58+
return entry != params.end();
59+
}
60+
61+
} // namespace ada
62+
63+
#endif // ADA_URL_SEARCH_PARAMS_INL_H

include/ada/url_search_params.h

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/**
2+
* @file url_search_params.h
3+
* @brief Declaration for the URL Search Params
4+
*/
5+
#ifndef ADA_URL_SEARCH_PARAMS_H
6+
#define ADA_URL_SEARCH_PARAMS_H
7+
8+
namespace ada {
9+
10+
#include <optional>
11+
#include <string>
12+
#include <string_view>
13+
#include <vector>
14+
15+
/**
16+
* @see https://url.spec.whatwg.org/#interface-urlsearchparams
17+
*/
18+
struct url_search_params {
19+
url_search_params() = default;
20+
url_search_params(const url_search_params &u) = default;
21+
url_search_params(url_search_params &&u) noexcept = default;
22+
url_search_params &operator=(url_search_params &&u) noexcept = default;
23+
url_search_params &operator=(const url_search_params &u) = default;
24+
~url_search_params() = default;
25+
26+
[[nodiscard]] inline size_t get_size() const noexcept;
27+
28+
/**
29+
* @see https://url.spec.whatwg.org/#dom-urlsearchparams-append
30+
*/
31+
inline void append(std::string_view key, std::string_view value);
32+
33+
/**
34+
* @see https://url.spec.whatwg.org/#dom-urlsearchparams-delete
35+
*/
36+
inline void remove(std::string_view key);
37+
inline void remove(std::string_view key, std::string_view value);
38+
39+
/**
40+
* @see https://url.spec.whatwg.org/#dom-urlsearchparams-get
41+
*/
42+
inline std::optional<std::string_view> get(std::string_view key);
43+
44+
/**
45+
* @see https://url.spec.whatwg.org/#dom-urlsearchparams-getall
46+
*/
47+
inline std::vector<std::string> get_all(std::string_view key);
48+
49+
/**
50+
* @see https://url.spec.whatwg.org/#dom-urlsearchparams-has
51+
*/
52+
inline bool has(std::string_view key) noexcept;
53+
54+
/**
55+
* @see https://url.spec.whatwg.org/#dom-urlsearchparams-set
56+
*/
57+
inline void set(std::string_view key, std::string_view value);
58+
59+
/**
60+
* @see https://url.spec.whatwg.org/#dom-urlsearchparams-sort
61+
*/
62+
inline void sort() const noexcept;
63+
64+
inline std::string to_string();
65+
66+
private:
67+
uint32_t size{0};
68+
std::vector<std::tuple<std::string, std::string>> params{};
69+
}; // url_search_params
70+
71+
} // namespace ada
72+
#endif

src/ada.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@
1111
#include "url_components.cpp"
1212
#include "url_aggregator.cpp"
1313
#include "ada_c.cpp"
14+
#include "url_search_params.cpp"

src/url_search_params.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include "ada.h"
2+
#include "ada/url_search_params.h"
3+
4+
#include <optional>
5+
#include <string>
6+
#include <string_view>
7+
#include <vector>
8+
9+
namespace ada {
10+
11+
inline void url_search_params::remove(const std::string_view key) {
12+
params.erase(
13+
std::remove_if(params.begin(), params.end(),
14+
[&key](auto param) { return std::get<0>(param) == key; }),
15+
params.end());
16+
}
17+
18+
inline void url_search_params::remove(const std::string_view key,
19+
std::string_view value) {
20+
params.erase(std::remove_if(params.begin(), params.end(),
21+
[&key, &value](auto param) {
22+
return std::get<0>(param) == key &&
23+
std::get<1>(param) == value;
24+
}),
25+
params.end());
26+
}
27+
28+
inline void url_search_params::sort() const noexcept {
29+
// TODO: Implement this
30+
}
31+
32+
inline void url_search_params::set(const std::string_view key,
33+
const std::string_view value) {
34+
params.erase(
35+
std::remove_if(params.begin(), params.end(),
36+
[&key](auto param) { return std::get<0>(param) == key; }),
37+
params.end());
38+
39+
params.emplace_back(std::string(key), std::string(value));
40+
}
41+
42+
inline std::string url_search_params::to_string() {
43+
if (params.empty()) {
44+
return "";
45+
}
46+
std::string out = "?";
47+
for (size_t i = 0; i < params.size(); i++) {
48+
auto param = params[i];
49+
auto key = std::get<0>(param);
50+
auto value = std::get<1>(param);
51+
52+
if (i != 0) {
53+
out += "&";
54+
}
55+
out.append(key);
56+
out += "=";
57+
out.append(value);
58+
}
59+
return out;
60+
}
61+
62+
} // namespace ada

tests/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,29 @@ add_executable(url_components url_components.cpp)
1515
add_executable(basic_tests basic_tests.cpp)
1616
add_executable(from_file_tests from_file_tests.cpp)
1717
add_executable(ada_c ada_c.cpp)
18+
add_executable(url_search_params url_search_params.cpp)
1819

1920
target_link_libraries(wpt_tests PRIVATE simdjson GTest::gtest_main)
2021
target_link_libraries(url_components PRIVATE simdjson GTest::gtest_main)
2122
target_link_libraries(basic_tests PRIVATE simdjson GTest::gtest_main)
2223
target_link_libraries(from_file_tests PRIVATE simdjson GTest::gtest_main)
2324
target_link_libraries(ada_c PRIVATE simdjson GTest::gtest_main)
25+
target_link_libraries(url_search_params PRIVATE simdjson GTest::gtest_main)
2426

2527
gtest_discover_tests(wpt_tests)
2628
gtest_discover_tests(url_components)
2729
gtest_discover_tests(basic_tests)
2830
gtest_discover_tests(from_file_tests)
2931
gtest_discover_tests(ada_c)
32+
gtest_discover_tests(url_search_params)
3033

3134
add_cpp_test(basic_fuzzer)
3235

3336
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
3437
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9)
3538
target_link_libraries(wpt_tests PUBLIC stdc++fs)
3639
target_link_libraries(url_components PUBLIC stdc++fs)
40+
target_link_libraries(url_search_params PUBLIC stdc++fs)
3741
endif()
3842
endif()
3943

@@ -43,4 +47,5 @@ if(MSVC OR MINGW)
4347
target_compile_definitions(basic_fuzzer PRIVATE _CRT_SECURE_NO_WARNINGS)
4448
target_compile_definitions(from_file_tests PRIVATE _CRT_SECURE_NO_WARNINGS)
4549
target_compile_definitions(basic_tests PRIVATE _CRT_SECURE_NO_WARNINGS)
50+
target_compile_definitions(url_search_params PRIVATE _CRT_SECURE_NO_WARNINGS)
4651
endif()

tests/url_components.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#include <filesystem>
33
#include <iostream>
44
#include <memory>
5-
#include <map>
65
#include <set>
76

87
#include "simdjson.h"

tests/url_search_params.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "ada.h"
2+
#include "gtest/gtest.h"
3+
4+
TEST(url_search_params, append) {
5+
auto search_params = ada::url_search_params();
6+
search_params.append("key", "value");
7+
ASSERT_EQ(search_params.get_size(), 1);
8+
ASSERT_TRUE(search_params.has("key"));
9+
search_params.append("key", "value2");
10+
ASSERT_EQ(search_params.get_size(), 2);
11+
ASSERT_EQ(search_params.get_all("key").size(), 2);
12+
SUCCEED();
13+
}

0 commit comments

Comments
 (0)