From 1be970c3f9faead5ee93ef01c1ff2a7b298065f4 Mon Sep 17 00:00:00 2001 From: Tony Gorez Date: Tue, 11 Jun 2024 17:49:34 +0200 Subject: [PATCH] feat(uri): add URI::URI(std::istream &) Signed-off-by: Tony Gorez --- src/uri/include/sourcemeta/jsontoolkit/uri.h | 11 +++++++++++ src/uri/uri.cc | 8 ++++++++ test/uri/uri_test.cc | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/src/uri/include/sourcemeta/jsontoolkit/uri.h b/src/uri/include/sourcemeta/jsontoolkit/uri.h index d3d70a8c1..1ce159255 100644 --- a/src/uri/include/sourcemeta/jsontoolkit/uri.h +++ b/src/uri/include/sourcemeta/jsontoolkit/uri.h @@ -42,6 +42,17 @@ class SOURCEMETA_JSONTOOLKIT_URI_EXPORT URI { /// ``` URI(std::string input); + /// This constructor creates a URI from a C++ input stream. For example: + /// + /// ```cpp + /// #include + /// #include + /// + /// std::istringstream input{"https://www.sourcemeta.com"}; + /// const sourcemeta::jsontoolkit::URI uri{input}; + /// ``` + URI(std::istream &input); + /// Destructor ~URI(); diff --git a/src/uri/uri.cc b/src/uri/uri.cc index 6a8f8c68a..67bbaab81 100644 --- a/src/uri/uri.cc +++ b/src/uri/uri.cc @@ -3,6 +3,7 @@ #include // assert #include // std::uint32_t +#include // std::istream #include // std::ostringstream #include // std::length_error, std::runtime_error #include // std::stoul, std::string, std::tolower @@ -72,6 +73,13 @@ URI::URI(std::string input) : data{std::move(input)}, internal{new Internal} { uri_parse(this->data, &this->internal->uri); } +URI::URI(std::istream &input) : internal{new Internal} { + std::ostringstream output; + output << input.rdbuf(); + this->data = output.str(); + uri_parse(this->data, &this->internal->uri); +} + URI::~URI() { uriFreeUriMembersA(&this->internal->uri); } URI::URI(const URI &other) : URI{other.recompose()} {} diff --git a/test/uri/uri_test.cc b/test/uri/uri_test.cc index 92266cf62..b1e0cce8a 100644 --- a/test/uri/uri_test.cc +++ b/test/uri/uri_test.cc @@ -20,3 +20,9 @@ TEST(URI, from_fragment) { EXPECT_EQ(fragment.value(), "foo"); EXPECT_EQ(uri.recompose(), "#foo"); } + +TEST(URI, using_istream) { + std::istringstream input{"https://example.com"}; + const sourcemeta::jsontoolkit::URI uri{input}; + EXPECT_EQ(uri.recompose(), "https://example.com"); +}