Skip to content

Commit

Permalink
Add type url parsing support
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 603390969
  • Loading branch information
jcking authored and copybara-github committed Feb 1, 2024
1 parent 037b973 commit 0b425e3
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 0 deletions.
2 changes: 2 additions & 0 deletions common/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ cc_library(
deps = [
"//internal:strings",
"@com_google_absl//absl/base:core_headers",
"@com_google_absl//absl/base:nullability",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:cord",
],
Expand All @@ -49,6 +50,7 @@ cc_test(
deps = [
":any",
"//internal:testing",
"@com_google_absl//absl/strings:string_view",
],
)

Expand Down
17 changes: 17 additions & 0 deletions common/any.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include <string>

#include "absl/base/nullability.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "internal/strings.h"
Expand All @@ -37,4 +38,20 @@ std::string Any::DebugString() const {
"}");
}

bool ParseTypeUrl(absl::string_view type_url,
absl::Nullable<absl::string_view*> prefix,
absl::Nullable<absl::string_view*> type_name) {
auto pos = type_url.find_last_of('/');
if (pos == absl::string_view::npos || pos + 1 == type_url.size()) {
return false;
}
if (prefix) {
*prefix = type_url.substr(0, pos + 1);
}
if (type_name) {
*type_name = type_url.substr(pos + 1);
}
return true;
}

} // namespace cel
12 changes: 12 additions & 0 deletions common/any.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <utility>

#include "absl/base/attributes.h"
#include "absl/base/nullability.h"
#include "absl/strings/cord.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
Expand Down Expand Up @@ -102,6 +103,17 @@ inline std::string MakeTypeUrl(absl::string_view type_name) {
return MakeTypeUrlWithPrefix(kTypeGoogleApisComPrefix, type_name);
}

bool ParseTypeUrl(absl::string_view type_url,
absl::Nullable<absl::string_view*> prefix,
absl::Nullable<absl::string_view*> type_name);
inline bool ParseTypeUrl(absl::string_view type_url,
absl::Nullable<absl::string_view*> type_name) {
return ParseTypeUrl(type_url, nullptr, type_name);
}
inline bool ParseTypeUrl(absl::string_view type_url) {
return ParseTypeUrl(type_url, nullptr);
}

} // namespace cel

#endif // THIRD_PARTY_CEL_CPP_COMMON_ANY_H_
28 changes: 28 additions & 0 deletions common/any_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#include "common/any.h"

#include "absl/strings/string_view.h"
#include "internal/testing.h"

namespace cel {
Expand All @@ -28,5 +29,32 @@ TEST(MakeTypeUrl, Basic) {
EXPECT_EQ(MakeTypeUrl("bar.Baz"), "type.googleapis.com/bar.Baz");
}

TEST(ParseTypeUrl, Valid) {
EXPECT_TRUE(ParseTypeUrl("type.googleapis.com/bar.Baz"));
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com"));
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com/"));
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com/foo/"));
}

TEST(ParseTypeUrl, TypeName) {
absl::string_view type_name;
EXPECT_TRUE(ParseTypeUrl("type.googleapis.com/bar.Baz", &type_name));
EXPECT_EQ(type_name, "bar.Baz");
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com", &type_name));
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com/", &type_name));
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com/foo/", &type_name));
}

TEST(ParseTypeUrl, PrefixAndTypeName) {
absl::string_view prefix;
absl::string_view type_name;
EXPECT_TRUE(ParseTypeUrl("type.googleapis.com/bar.Baz", &prefix, &type_name));
EXPECT_EQ(prefix, "type.googleapis.com/");
EXPECT_EQ(type_name, "bar.Baz");
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com", &prefix, &type_name));
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com/", &prefix, &type_name));
EXPECT_FALSE(ParseTypeUrl("type.googleapis.com/foo/", &prefix, &type_name));
}

} // namespace
} // namespace cel

0 comments on commit 0b425e3

Please # to comment.