extern crate rand; use std::io; use std::vec::Vec; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); let mut tries_counter : u32 = 0; let mut attempt_history = Vec::<(u32, String)>::new(); println!("The secret number is: {}", secret_number); loop { // Get the value from inside the Ok, else print the error let guess = match get_input() { Ok(num) => num, Err(e) => { println!("{}", e); continue; } }; println!("You guessed: {}", guess); tries_counter += 1; attempt_history.push((tries_counter, format!("{}", guess))); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => { println!("You win!"); println!("Total number of attempts: {}", tries_counter); println!("First print:"); for x in attempt_history.iter() { println!("{:?}", x); } println!("\nSecond print:"); for x in attempt_history.iter() { println!("{:?}", x); } break; } } println!("Attempts so far: {}\n ", tries_counter); } } fn get_input() -> Result<u32, String> { let mut text_input = String::new(); println!("Please input your guess."); /* Instead of using the expect, save and return potential error */ let input = io::stdin() .read_line(&mut text_input); match input { Ok(_) => (), Err(e) => return Err(format!("{}", e)), } match text_input.trim().parse::<u32>() { Ok(num) => return Ok(num), Err(e) => { return Err(format!("in parsing u32, {}", e)); } }; }