pub const ACE: Rank = 1;
pub const JACK: Rank = 11;
pub const QUEEN: Rank = 12;
pub const KING: Rank = 13;
pub type Rank = u8;
pub fn rank_from_string<S: Into<String>>(string: S) -> Result<Rank, String> {
let string = string.into();
match string.to_lowercase().trim() {
"ace" => Ok(ACE),
"a" => Ok(ACE),
"t" => Ok(10),
"jack" => Ok(JACK),
"j" => Ok(JACK),
"queen" => Ok(QUEEN),
"q" => Ok(QUEEN),
"king" => Ok(KING),
"k" => Ok(KING),
_ => match string.trim().parse::<u8>() {
Err(_) => Err(format!("Rank is neither named rank nor integer: \"{}\"", string)),
Ok(rank) => match rank {
0 => Err("Rank cannot be 0".to_string()),
1..=13 => Ok(rank),
_ => Err(format!("Rank cannot be greater than 13 (rank is {})", rank)),
},
},
}
}