From dcea19a5d787c94982d7e8123463798913741c46 Mon Sep 17 00:00:00 2001 From: mikysett Date: Tue, 16 Aug 2022 17:27:07 +0100 Subject: [PATCH] docs(unwrap_or_expect): rewrite the subject Rewrite the subject completely to give more meaninful learning experience to students. --- subjects/unwrap_or_expect/README.md | 83 ++++++++++------------------- 1 file changed, 29 insertions(+), 54 deletions(-) diff --git a/subjects/unwrap_or_expect/README.md b/subjects/unwrap_or_expect/README.md index 2fd5e240..59205d13 100644 --- a/subjects/unwrap_or_expect/README.md +++ b/subjects/unwrap_or_expect/README.md @@ -2,45 +2,31 @@ ### Instructions -A **function** named **odd_to_even** will be given, which returns a `Result`. If there is an even value in the vector, the function will return a tuple with a string, stating the error, and a vector with the elements that caused the error. +Create a **function** named **fetch_data** which has two arguments: +- `server`: Which is a `Result` having the server url or an error message inside. +- `security_level`: Which is an `enum` defining the behavior of the function in case of errors. -The objective is to execute the `odd_to_even` function and handle the errors returned by it. +The `security_level` will work as follow: +- `Unknown`: The function panics without printing any custom message. +- `High`: The function panics and prints the error message `ERROR: program stops`. +- `Medium`: The function returns the string `WARNING: check the server`. +- `Low`: The function returns the string `Not found: [SERVER_URL]`. +- `BlockServer`: The function will panic only if the `Result` value is `Ok` and the error message will be the string contained in `Ok`. -Create the following functions which receive a vector: - -- `expect`: which returns the error adding the string "ERROR " to the beginning. -- `unwrap_or`: which in case of error, returns an empty vector. -- `unwrap_err`: which panics if the value is `Ok`, or returns the string containing the error in case of `Err`. -- `unwrap`: which unwraps the `Result`. -- `unwrap_or_else`: which in case of error returns the vector of elements that caused the error. +To return from **fetch_data** you must use `expect`, `unwrap_or`, `unwrap_err`, `unwrap` and `unwrap_or_else`. ### Expected Functions ```rust -pub fn odd_to_even(data: Vec) -> Result, (String, Vec)> { - let mut a = Vec::new(); - a.extend(data.iter().filter(|&value| value % 2 == 0)); - if a.len() != 0 { - return Err(("There is a even value in the vector!".to_string(), a)); - } - a.extend(data.iter().map(|&value| { - value + 1 - })); - Ok(a) -} -pub fn expect(v: Vec) -> Vec { - +pub enum Security { + Unknown, + High, + Medium, + Low, + BlockServer, } -pub fn unwrap_or(v: Vec) -> Vec { -} -pub fn unwrap_err(v: Vec) -> (String, Vec) { - -} -pub fn unwrap(v: Vec) -> Vec { - -} -pub fn unwrap_or_else(v: Vec) -> Vec { +pub fn fetch_data(server: Result, security_level: Security) -> String { } ``` @@ -53,38 +39,27 @@ Here is a program to test your function: use unwrap_or_expect::*; fn main() { - // // if uncommented, the below line will give an expect "ERROR " - // println!("{:?}", expect(vec![1, 3, 2, 5])); - - println!("{:?}", unwrap_or(vec![1, 3, 2, 5])); - println!("{:?}", unwrap_or(vec![1, 3, 5])); - - println!("{:?}", unwrap_err(vec![1, 3, 2, 5])); - - // // if uncommented, the below line will give an unwraped error - // println!("{:?}", unwrap_err(vec![1, 3, 5])); + println!("{}", fetch_data(Ok("server1.com".to_string()), Security::Medium)); + println!("{}", fetch_data(Err(String::new()), Security::Medium)); + println!("{}", fetch_data(Err("server2.com".to_string()), Security::Low)); - println!("{:?}", unwrap(vec![1, 3, 5])); + // Panics with no custom message + // fetch_data(Err("ERROR CRITICAL".to_string()), Security::Unknown); - //// if uncommented, the below line will give an error - // println!("{:?}", unwrap(vec![1, 3, 2, 5])); + // Panics with the message "ERROR: program stops" + // fetch_data(Err(String::new()), Security::High); - println!("{:?}", unwrap_or_else(vec![1, 3, 5])); - println!("{:?}", unwrap_or_else(vec![3, 2, 6, 5])); + // Panics with the message "malicious_server.com" + // fetch_data(Ok("malicious_server.com".to_string()), Security::BlockServer); } ``` And its output: ```console -[] -[2, 4, 6] -("There is a even value in the vector!", [2]) -[2, 4, 6] -Ok([2, 4, 6]) -[2, 4, 6] -Err(("There is a even value in the vector!", [2, 6])) -[2, 6] +server1.com +WARNING: check the server +Not found: server2.com $ ```