diff options
author | garhve <git@garhve.com> | 2023-01-01 23:23:55 +0800 |
---|---|---|
committer | garhve <git@garhve.com> | 2023-01-01 23:23:55 +0800 |
commit | 0e89468188b9d347495dad5b98af137e5f477432 (patch) | |
tree | 0109b539d1defe6469099476df262838ddf02320 /rust/theBook/chapter-9-error-handling/result | |
parent | bbc35c878f0f0fcf7234f23efb6820aebf4287c3 (diff) |
finish chapter 9
Diffstat (limited to 'rust/theBook/chapter-9-error-handling/result')
-rw-r--r-- | rust/theBook/chapter-9-error-handling/result/Cargo.toml | 8 | ||||
-rw-r--r-- | rust/theBook/chapter-9-error-handling/result/src/main.rs | 62 |
2 files changed, 70 insertions, 0 deletions
diff --git a/rust/theBook/chapter-9-error-handling/result/Cargo.toml b/rust/theBook/chapter-9-error-handling/result/Cargo.toml new file mode 100644 index 0000000..e32be4b --- /dev/null +++ b/rust/theBook/chapter-9-error-handling/result/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "result" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rust/theBook/chapter-9-error-handling/result/src/main.rs b/rust/theBook/chapter-9-error-handling/result/src/main.rs new file mode 100644 index 0000000..265250c --- /dev/null +++ b/rust/theBook/chapter-9-error-handling/result/src/main.rs @@ -0,0 +1,62 @@ +use std::fs::{Self,File}; +use std::io::{Self, Read, ErrorKind}; + +fn main() { + let greeting_file_result = File::open("hello.txt"); + + let greeting_file = match greeting_file_result { + Ok(file) => file, + Err(error) => match error.kind() { + ErrorKind::NotFound => match File::create("hello.txt") { + Ok(fc) => fc, + Err(e) => panic!("problem opening file {:?}",e), + }, + other_error => { + panic!("problem opening file {:?}",other_error); + } + }, + }; + + // or use unwrap, it will return value or panic just like match + // let greeting_file = File::open("hello.txt").unwrap(); +} + +// functions to read username from file +// each one is a shorter solution of its previous one. +fn read_username_from_file() -> Result<String, io::Error> { + let username_file_result = File::open("hello.txt"); + + let username_file = match username_file_result { + Ok(file) => file, + Err(e) => return Err(e), + }; + + let mut username = String::new(); + + match username_file.read_to_string(&mut username) { + Ok(_) => Ok(username), + Err(e) => Err(e), + } +} + +// ? is like match, but shorter +// return content of Ok() if true, or return Err() from whole function +fn read_username_from_file_short() -> Result<String, io::Error> { + let mut username_file = File::open("hello.txt")?; + + let mut username = String::new(); + + username_file.read_to_string(&mut username)?; + Ok(username) +} + +fn read_username_from_file_even_short() -> Result<String, io::Error> { + let mut username = String::new(); + + File::open("hello.txt")?.read_to_string(&mut username)?; + Ok(username) +} + +fn read_username_from_file_shortest() -> Result<String, io::Error> { + fs::read_to_string("hello.txt") +} |