| // Copyright 2025 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "third_party/liburlpattern/part.h" | |
| #include <cctype> | |
| #include <ostream> | |
| #include <string> | |
| #include <utility> | |
| #include "third_party/abseil-cpp/absl/base/macros.h" | |
| namespace liburlpattern { | |
| std::ostream& operator<<(std::ostream& o, const Part& part) { | |
| o << "{ type:" << part.type << ", name:" << part.name | |
| << ", prefix:" << part.prefix << ", value:" << part.value | |
| << ", suffix:" << part.suffix << ", modifier:" << part.modifier << " }"; | |
| return o; | |
| } | |
| std::ostream& operator<<(std::ostream& o, PartType type) { | |
| switch (type) { | |
| case PartType::kFullWildcard: | |
| return o << "kFullWildcard"; | |
| case PartType::kSegmentWildcard: | |
| return o << "kSegmentWildcard"; | |
| case PartType::kRegex: | |
| return o << "kRegex"; | |
| case PartType::kFixed: | |
| return o << "kFixed"; | |
| } | |
| } | |
| std::ostream& operator<<(std::ostream& o, Modifier modifier) { | |
| switch (modifier) { | |
| case Modifier::kZeroOrMore: | |
| return o << "kZeroOrMore"; | |
| case Modifier::kOptional: | |
| return o << "kOptional"; | |
| case Modifier::kOneOrMore: | |
| return o << "kOneOrMore"; | |
| case Modifier::kNone: | |
| return o << "kNone"; | |
| } | |
| } | |
| Part::Part(PartType t, std::string v, Modifier m) | |
| : type(t), value(std::move(v)), modifier(m) { | |
| ABSL_ASSERT(type == PartType::kFixed); | |
| } | |
| Part::Part(PartType t, | |
| std::string n, | |
| std::string p, | |
| std::string v, | |
| std::string s, | |
| Modifier m) | |
| : type(t), | |
| name(std::move(n)), | |
| prefix(std::move(p)), | |
| value(std::move(v)), | |
| suffix(std::move(s)), | |
| modifier(m) { | |
| ABSL_ASSERT(type != PartType::kFixed); | |
| ABSL_ASSERT(!name.empty()); | |
| if (type == PartType::kFullWildcard || type == PartType::kSegmentWildcard) { | |
| ABSL_ASSERT(value.empty()); | |
| } | |
| } | |
| bool Part::HasCustomName() const { | |
| // Determine if the part name was custom, like `:foo`, or an | |
| // automatically assigned numeric value. Since custom group | |
| // names follow javascript identifier rules the first character | |
| // cannot be a digit, so that is all we need to check here. | |
| return !name.empty() && !std::isdigit(name[0]); | |
| } | |
| bool Part::IsSimpleFullWildcard() const { | |
| return type == PartType::kFullWildcard && suffix.empty() && prefix.empty() && | |
| modifier == Modifier::kNone && !HasCustomName(); | |
| } | |
| } // namespace liburlpattern |