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 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}