|
|
@ -16,84 +16,7 @@ Copyright (C) 2020 by Maxim Prokhorov <prokhorov dot max at outlook dot com> |
|
|
|
#include <memory> |
|
|
|
#include <vector> |
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------- |
|
|
|
|
|
|
|
struct PathPart { |
|
|
|
enum class Type { |
|
|
|
Unknown, |
|
|
|
Value, |
|
|
|
SingleWildcard, |
|
|
|
MultiWildcard |
|
|
|
}; |
|
|
|
|
|
|
|
Type type; |
|
|
|
size_t offset; |
|
|
|
size_t length; |
|
|
|
}; |
|
|
|
|
|
|
|
struct PathParts { |
|
|
|
using Parts = std::vector<PathPart>; |
|
|
|
|
|
|
|
PathParts() = delete; |
|
|
|
|
|
|
|
PathParts(const PathParts&) = default; |
|
|
|
PathParts(PathParts&&) noexcept = default; |
|
|
|
|
|
|
|
explicit PathParts(const String& path); |
|
|
|
|
|
|
|
explicit operator bool() const { |
|
|
|
return _ok; |
|
|
|
} |
|
|
|
|
|
|
|
void clear() { |
|
|
|
_parts.clear(); |
|
|
|
} |
|
|
|
|
|
|
|
void reserve(size_t size) { |
|
|
|
_parts.reserve(size); |
|
|
|
} |
|
|
|
|
|
|
|
String operator[](size_t index) const { |
|
|
|
auto& part = _parts[index]; |
|
|
|
return _path.substring(part.offset, part.offset + part.length); |
|
|
|
} |
|
|
|
|
|
|
|
const String& path() const { |
|
|
|
return _path; |
|
|
|
} |
|
|
|
|
|
|
|
const Parts& parts() const { |
|
|
|
return _parts; |
|
|
|
} |
|
|
|
|
|
|
|
size_t size() const { |
|
|
|
return _parts.size(); |
|
|
|
} |
|
|
|
|
|
|
|
Parts::const_iterator begin() const { |
|
|
|
return _parts.begin(); |
|
|
|
} |
|
|
|
|
|
|
|
Parts::const_iterator end() const { |
|
|
|
return _parts.end(); |
|
|
|
} |
|
|
|
|
|
|
|
bool match(const PathParts& path) const; |
|
|
|
bool match(const String& path) const { |
|
|
|
return match(PathParts(path)); |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
PathPart& emplace_back(PathPart::Type type, size_t offset, size_t length) { |
|
|
|
PathPart part { type, offset, length }; |
|
|
|
_parts.push_back(std::move(part)); |
|
|
|
return _parts.back(); |
|
|
|
} |
|
|
|
|
|
|
|
const String& _path; |
|
|
|
Parts _parts; |
|
|
|
bool _ok { false }; |
|
|
|
}; |
|
|
|
#include "api_path.h" |
|
|
|
|
|
|
|
// this is a purely temporary object, which we can only create while doing the API dispatch |
|
|
|
|
|
|
|