Add support for parsing the hostnames we're going to use on the Pis

Change-Id: Ifee2e2066d7d3034bdf9aece2983922d5c636a0f
diff --git a/aos/network/team_number.cc b/aos/network/team_number.cc
index b031299..14fadab 100644
--- a/aos/network/team_number.cc
+++ b/aos/network/team_number.cc
@@ -35,6 +35,29 @@
   return std::nullopt;
 }
 
+std::optional<uint16_t> ParsePiTeamNumber(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(first_separator, second_separator - first_separator);
+  int number;
+  if (!util::StringToNumber(number_string, &number)) {
+    return std::nullopt;
+  }
+  return number;
+}
+
 }  // namespace team_number_internal
 
 namespace {
@@ -65,6 +88,13 @@
       return *result;
     }
   }
+  {
+    const auto result = team_number_internal::ParsePiTeamNumber(hostname);
+    if (result) {
+      LOG(INFO) << "Pi hostname team number is: " << *result;
+      return *result;
+    }
+  }
   LOG(FATAL) << "Failed to parse a team number from hostname: " << hostname;
 }
 
diff --git a/aos/network/team_number.h b/aos/network/team_number.h
index 6eb1335..618affb 100644
--- a/aos/network/team_number.h
+++ b/aos/network/team_number.h
@@ -28,6 +28,8 @@
 
 std::optional<uint16_t> ParseRoborioTeamNumber(const std::string &hostname);
 
+std::optional<uint16_t> ParsePiTeamNumber(const std::string &hostname);
+
 }  // namespace team_number_internal
 }  // namespace network
 }  // namespace aos
diff --git a/aos/network/team_number_test.cc b/aos/network/team_number_test.cc
index 03001de..c11f0a0 100644
--- a/aos/network/team_number_test.cc
+++ b/aos/network/team_number_test.cc
@@ -7,6 +7,7 @@
 namespace testing {
 
 using team_number_internal::ParseRoborioTeamNumber;
+using team_number_internal::ParsePiTeamNumber;
 
 TEST(TeamNumberTest, Parse2015TeamNumber) {
   EXPECT_EQ(971u, *ParseRoborioTeamNumber("roboRIO-971"));
@@ -29,6 +30,17 @@
   EXPECT_FALSE(ParseRoborioTeamNumber("roboRIO--FRC"));
 }
 
+TEST(TeamNumberTest, ParsePiTeamNumber) {
+  EXPECT_EQ(971u, *ParsePiTeamNumber("pi-971-1"));
+  EXPECT_EQ(8971u, *ParsePiTeamNumber("pi-8971-22"));
+  EXPECT_EQ(8971u, *ParsePiTeamNumber("pi-8971-"));
+
+  EXPECT_FALSE(ParseRoborioTeamNumber("pi"));
+  EXPECT_FALSE(ParseRoborioTeamNumber("pi-"));
+  EXPECT_FALSE(ParseRoborioTeamNumber("pi-971"));
+  EXPECT_FALSE(ParseRoborioTeamNumber("pi-971a-1"));
+}
+
 }  // namespace testing
 }  // namespace network
 }  // namespace aos