blob: 22886fa24e3d87ad09e2f1c232f9e7a196d6c248 [file] [log] [blame]
// 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]);
}
} // namespace liburlpattern