diff options
author | Richard Walters <rwalters@digitalstirling.com> | 2018-06-30 22:53:39 -0700 |
---|---|---|
committer | Richard Walters <rwalters@digitalstirling.com> | 2018-06-30 22:53:39 -0700 |
commit | f126a79dea5f139449754ecdf7bc94132eeea569 (patch) | |
tree | fb55a9c27936291a6ef740c08d169ac5e8ae4c92 | |
parent | e59d3f37134daca65e2fbed7a54613a4831a7867 (diff) |
Refactoring
Extract method that parses the path segments from
the whole path string.
-rw-r--r-- | src/Uri.cpp | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/src/Uri.cpp b/src/Uri.cpp index b0165de..1768849 100644 --- a/src/Uri.cpp +++ b/src/Uri.cpp @@ -58,6 +58,8 @@ namespace Uri { * This contains the private properties of a Uri instance. */ struct Uri::Impl { + // Properties + /** * This is the "scheme" element of the URI. */ @@ -101,6 +103,45 @@ namespace Uri { * if it has one. */ std::string fragment; + + // Methods + + /** + * This method builds the internal path element sequence + * by parsing it from the given path string. + * + * @param[in] pathString + * This is the string containing the whole path of the URI. + * + * @return + * An indication if the path was parsed correctly or not + * is returned. + */ + bool ParsePath(std::string pathString) { + path.clear(); + if (pathString == "/") { + // Special case of a path that is empty but needs a single + // empty-string element to indicate that it is absolute. + path.push_back(""); + pathString.clear(); + } else if (!pathString.empty()) { + for(;;) { + auto pathDelimiter = pathString.find('/'); + if (pathDelimiter == std::string::npos) { + path.push_back(pathString); + pathString.clear(); + break; + } else { + path.emplace_back( + pathString.begin(), + pathString.begin() + pathDelimiter + ); + pathString = pathString.substr(pathDelimiter + 1); + } + } + } + return true; + } }; Uri::~Uri() = default; @@ -171,27 +212,8 @@ namespace Uri { } // Next, parse the path. - impl_->path.clear(); - if (pathString == "/") { - // Special case of a path that is empty but needs a single - // empty-string element to indicate that it is absolute. - impl_->path.push_back(""); - pathString.clear(); - } else if (!pathString.empty()) { - for(;;) { - auto pathDelimiter = pathString.find('/'); - if (pathDelimiter == std::string::npos) { - impl_->path.push_back(pathString); - pathString.clear(); - break; - } else { - impl_->path.emplace_back( - pathString.begin(), - pathString.begin() + pathDelimiter - ); - pathString = pathString.substr(pathDelimiter + 1); - } - } + if (!impl_->ParsePath(pathString)) { + return false; } // Next, parse the fragment if there is one. |