mirror of
https://github.com/ahgamut/rust-ape-example.git
synced 2024-05-14 17:42:41 +00:00
69 lines
1.8 KiB
Rust
69 lines
1.8 KiB
Rust
// ./src/error/result/result_map.md
|
|
|
|
|
|
use std::num::ParseIntError;
|
|
|
|
// With the return type rewritten, we use pattern matching without `unwrap()`.
|
|
fn multiply(first_number_str: &str, second_number_str: &str) -> Result<i32, ParseIntError> {
|
|
match first_number_str.parse::<i32>() {
|
|
Ok(first_number) => {
|
|
match second_number_str.parse::<i32>() {
|
|
Ok(second_number) => {
|
|
Ok(first_number * second_number)
|
|
},
|
|
Err(e) => Err(e),
|
|
}
|
|
},
|
|
Err(e) => Err(e),
|
|
}
|
|
}
|
|
|
|
fn print(result: Result<i32, ParseIntError>) {
|
|
match result {
|
|
Ok(n) => println!("n is {}", n),
|
|
Err(e) => println!("Error: {}", e),
|
|
}
|
|
}
|
|
|
|
fn part0() {
|
|
// This still presents a reasonable answer.
|
|
let twenty = multiply("10", "2");
|
|
print(twenty);
|
|
|
|
// The following now provides a much more helpful error message.
|
|
let tt = multiply("t", "2");
|
|
print(tt);
|
|
}
|
|
|
|
// As with `Option`, we can use combinators such as `map()`.
|
|
// This function is otherwise identical to the one above and reads:
|
|
// Modify n if the value is valid, otherwise pass on the error.
|
|
fn multiply2(first_number_str: &str, second_number_str: &str) -> Result<i32, ParseIntError> {
|
|
first_number_str.parse::<i32>().and_then(|first_number| {
|
|
second_number_str.parse::<i32>().map(|second_number| first_number * second_number)
|
|
})
|
|
}
|
|
|
|
fn print2(result: Result<i32, ParseIntError>) {
|
|
match result {
|
|
Ok(n) => println!("n is {}", n),
|
|
Err(e) => println!("Error: {}", e),
|
|
}
|
|
}
|
|
|
|
fn part1() {
|
|
// This still presents a reasonable answer.
|
|
let twenty = multiply2("10", "2");
|
|
print(twenty);
|
|
|
|
// The following now provides a much more helpful error message.
|
|
let tt = multiply2("t", "2");
|
|
print(tt);
|
|
}
|
|
|
|
pub fn main() {
|
|
part0();
|
|
part1();
|
|
}
|
|
|