+const PAD_WIDTH: usize = 25;
+
+impl Display for HLQueryResult {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write_datapoint!(f, PAD_WIDTH, "Address:", self.address)?;
+ match &self.info {
+ Ok(info) => {
+ writeln!(f, "\nServer info:")?;
+ write_datapoint!(f, PAD_WIDTH, "Server name:", info.name)?;
+ write_datapoint!(f, PAD_WIDTH, "Game:", info.game)?;
+ write_datapoint!(f, PAD_WIDTH, "Folder:", info.folder)?;
+ write_datapoint!(f, PAD_WIDTH, "Current map:", info.map)?;
+ write_datapoint!(f, PAD_WIDTH, "Protocol version:", info.protocol)?;
+ write_datapoint!(f, PAD_WIDTH, "Steam App ID:", info.app_id)?;
+ write_datapoint!(f, PAD_WIDTH, "Number of players:", format!("{}/{}", info.players, info.max_players))?;
+ write_datapoint!(f, PAD_WIDTH, "Number of bots:", info.bots)?;
+ write_datapoint!(f, PAD_WIDTH, "Server type:", ServerType(&info.server_type))?;
+ write_datapoint!(f, PAD_WIDTH, "Server OS:", ServerOS(&info.server_os))?;
+ write_datapoint!(f, PAD_WIDTH, "Password protected:", if info.visibility { "Private" } else { "Public" })?;
+ write_datapoint!(f, PAD_WIDTH, "VAC enabled:", info.vac)?;
+ write_datapoint!(f, PAD_WIDTH, "The Ship mode:", TheShip(&info.the_ship))?;
+ write_datapoint!(f, PAD_WIDTH, "Server version:", info.version)?;
+ write_datapoint!(f, PAD_WIDTH, "Extra Data Flag:", info.edf)?;
+ write_datapoint!(f, PAD_WIDTH, "Server port:", info.extended_server_info.port.map_or("Unknown".to_string(), |i| i.to_string()))?;
+ write_datapoint!(f, PAD_WIDTH, "Steam ID:", info.extended_server_info.steam_id.map_or("Unknown".to_string(), |i| i.to_string()))?;
+ write_datapoint!(f, PAD_WIDTH, "Keywords:", info.extended_server_info.keywords.clone().unwrap_or("Unknown".to_string()))?;
+ write_datapoint!(f, PAD_WIDTH, "Game ID:", info.extended_server_info.game_id.map_or("Unknown".to_string(), |i| i.to_string()))?;
+ write_datapoint!(f, PAD_WIDTH, "Source TV port:", SourceTVInfo(&info.source_tv))?;
+ },
+ Err(e) =>
+ writeln!(f, "Failed to query server info:\t{}", e)?
+ }
+
+ match &self.rules {
+ Ok(rules) => {
+ writeln!(f, "\nGame rules (CVARs):")?;
+ for rule in rules {
+ write_datapoint!(f, PAD_WIDTH, rule.name, format!("\"{}\"", rule.value))?;
+ }
+ }
+ Err(e) =>
+ writeln!(f, "Failed to query game rules:\t{}", e)?
+ }
+
+ match &self.players {
+ Ok(players) => {
+ writeln!(f, "\nPlayers:")?;
+ writeln!(f, "\t{:>3} players online.", players.len())?;
+ for player in players {
+ writeln!(f, "{}: {:<30} {:>4} {:>10} {}",
+ player.index,
+ player.name,
+ player.score,
+ player.duration,
+ TheShipPlayer(&player.the_ship))?;
+ }
+ Ok(())
+ }
+ Err(e) =>
+ writeln!(f, "Failed to query players:\t{}", e)
+ }
+ }
+}
+