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