Add function to parse pi number from hostname
Change-Id: Ie3f01d98e368816a3e58abe3d7639d4243a44012
diff --git a/aos/network/team_number.cc b/aos/network/team_number.cc
index d2fbc8e..8d4e69e 100644
--- a/aos/network/team_number.cc
+++ b/aos/network/team_number.cc
@@ -120,5 +120,32 @@
void OverrideTeamNumber(uint16_t team) { override_team = team; }
+std::optional<uint16_t> ParsePiNumber(const std::string &hostname) {
+ if (hostname.substr(0, 3) != "pi-") {
+ return std::nullopt;
+ }
+ size_t first_separator = hostname.find('-');
+ if (first_separator == hostname.npos ||
+ first_separator >= hostname.size() - 2) {
+ return std::nullopt;
+ }
+ ++first_separator;
+ const size_t second_separator = hostname.find('-', first_separator);
+ if (second_separator == hostname.npos) {
+ return std::nullopt;
+ }
+ const std::string number_string =
+ hostname.substr(second_separator + 1, hostname.size() - second_separator - 1);
+ if (number_string.size() == 0) {
+ return std::nullopt;
+ }
+
+ int number;
+ if (!util::StringToNumber(number_string, &number)) {
+ return std::nullopt;
+ }
+ return number;
+}
+
} // namespace network
} // namespace aos
diff --git a/aos/network/team_number.h b/aos/network/team_number.h
index 618affb..91a61f9 100644
--- a/aos/network/team_number.h
+++ b/aos/network/team_number.h
@@ -24,10 +24,14 @@
// Guaranteed to be safe to call during static initialization time.
void OverrideTeamNumber(uint16_t team);
+// Returns the pi number for a pi formated hostname. pi-team#-pi# (pi-971-5)
+std::optional<uint16_t> ParsePiNumber(const std::string &hostname);
+
namespace team_number_internal {
std::optional<uint16_t> ParseRoborioTeamNumber(const std::string &hostname);
+// Returns the team number for a pi formated hostname. pi-team#-pi#
std::optional<uint16_t> ParsePiTeamNumber(const std::string &hostname);
} // namespace team_number_internal
diff --git a/aos/network/team_number_test.cc b/aos/network/team_number_test.cc
index c11f0a0..68727e2 100644
--- a/aos/network/team_number_test.cc
+++ b/aos/network/team_number_test.cc
@@ -6,8 +6,8 @@
namespace network {
namespace testing {
-using team_number_internal::ParseRoborioTeamNumber;
using team_number_internal::ParsePiTeamNumber;
+using team_number_internal::ParseRoborioTeamNumber;
TEST(TeamNumberTest, Parse2015TeamNumber) {
EXPECT_EQ(971u, *ParseRoborioTeamNumber("roboRIO-971"));
@@ -39,6 +39,14 @@
EXPECT_FALSE(ParseRoborioTeamNumber("pi-"));
EXPECT_FALSE(ParseRoborioTeamNumber("pi-971"));
EXPECT_FALSE(ParseRoborioTeamNumber("pi-971a-1"));
+
+ EXPECT_EQ(1u, *ParsePiNumber("pi-971-1"));
+ EXPECT_EQ(22u, *ParsePiNumber("pi-8971-22"));
+
+ EXPECT_FALSE(ParsePiNumber("pi-8971-"));
+ EXPECT_FALSE(ParsePiNumber("pi"));
+ EXPECT_FALSE(ParsePiNumber("pi-"));
+ EXPECT_FALSE(ParsePiNumber("pi-971"));
}
} // namespace testing