gcg_parser/gcg/
player.rs

1use crate::token::{Error, Result};
2
3#[derive(Debug, PartialEq)]
4pub struct Player {
5	pub nickname: String,
6	pub full_name: String,
7}
8
9impl Player {
10	/// The player pragma indicates the nickname and full name of a player.
11	///
12	/// # Examples
13	/// ```
14	/// # use gcg_parser::Player;
15	/// # use anyhow::Ok;
16	/// let text = "#player1 xXFerrisXx Ferris The Crab";
17	/// let player = Player::build(text)?;
18	///
19	/// assert_eq!(
20	///     player,
21	///     Player {
22	///         nickname: "xXFerrisXx".to_string(),
23	///         full_name: "Ferris The Crab".to_string(),
24	///     }
25	/// );
26	/// # Ok(())
27	/// ```
28	///
29	/// # Errors
30	///
31	/// If the nickname or full name tokens are missing, a
32	/// [`MissingToken`](GcgError::MissingToken) error is returned
33	pub fn build(text: &str) -> Result<Player> {
34		let mut tokens = text.splitn(3, ' ').skip(1);
35
36		let mut get_token = |token: &str, token_index| {
37			tokens
38				.next()
39				.ok_or_else(|| Error::MissingToken {
40					token: token.to_string(),
41					text: text.to_string(),
42					token_index,
43				})
44		};
45
46		let nickname = get_token("nickname", 2)?.to_string();
47		let full_name = get_token("full_name", 3)?.to_string();
48
49		Ok(Player {
50			nickname,
51			full_name,
52		})
53	}
54}
55
56#[cfg(test)]
57mod tests {
58	use super::*;
59
60	#[test]
61	fn should_return_error_with_field_name_and_position() {
62		let text = "#player1 20jasper";
63		let error = Player::build(text)
64			.unwrap_err()
65			.to_string();
66
67		assert!(error.contains("full_name"));
68		assert!(error.contains("position 3"));
69	}
70}