use crate::token::{Error, Result};
#[derive(Debug, PartialEq)]
pub struct Player {
pub nickname: String,
pub full_name: String,
}
impl Player {
pub fn build(text: &str) -> Result<Player> {
let mut tokens = text.splitn(3, ' ').skip(1);
let mut get_token = |token: &str, token_index| {
tokens
.next()
.ok_or_else(|| Error::MissingToken {
token: token.to_string(),
text: text.to_string(),
token_index,
})
};
let nickname = get_token("nickname", 2)?.to_string();
let full_name = get_token("full_name", 3)?.to_string();
Ok(Player {
nickname,
full_name,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_return_error_with_field_name_and_position() {
let text = "#player1 20jasper";
let error = Player::build(text)
.unwrap_err()
.to_string();
assert!(error.contains("full_name"));
assert!(error.contains("position 3"));
}
}