diff options
| author | apogeeoak <59737221+apogeeoak@users.noreply.github.com> | 2022-02-04 19:27:42 -0500 |
|---|---|---|
| committer | apogeeoak <59737221+apogeeoak@users.noreply.github.com> | 2022-02-04 19:27:42 -0500 |
| commit | c1f35e46dffc63e1c8660b8e1fc91e9a9fca3e39 (patch) | |
| tree | 6d25f2fcd6e0de9d09f588ae33f7017c34cd31c9 /exercises/error_handling/errors5.rs | |
| parent | f78c48020830d7900dd8d81f355606581670446d (diff) | |
| parent | cd2b5e8e3b616e769d2c17df45f813772aa81530 (diff) | |
Merge branch 'main' into text
Diffstat (limited to 'exercises/error_handling/errors5.rs')
| -rw-r--r-- | exercises/error_handling/errors5.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/exercises/error_handling/errors5.rs b/exercises/error_handling/errors5.rs new file mode 100644 index 0000000..365a869 --- /dev/null +++ b/exercises/error_handling/errors5.rs @@ -0,0 +1,53 @@ +// errors5.rs + +// This program uses a completed version of the code from errors4. +// It won't compile right now! Why? +// Execute `rustlings hint errors5` for hints! + +// I AM NOT DONE + +use std::error; +use std::fmt; +use std::num::ParseIntError; + +// TODO: update the return type of `main()` to make this compile. +fn main() -> Result<(), ParseIntError> { + let pretend_user_input = "42"; + let x: i64 = pretend_user_input.parse()?; + println!("output={:?}", PositiveNonzeroInteger::new(x)?); + Ok(()) +} + +// Don't change anything below this line. + +#[derive(PartialEq, Debug)] +struct PositiveNonzeroInteger(u64); + +#[derive(PartialEq, Debug)] +enum CreationError { + Negative, + Zero, +} + +impl PositiveNonzeroInteger { + fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> { + match value { + x if x < 0 => Err(CreationError::Negative), + x if x == 0 => Err(CreationError::Zero), + x => Ok(PositiveNonzeroInteger(x as u64)) + } + } +} + +// This is required so that `CreationError` can implement `error::Error`. +impl fmt::Display for CreationError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let description = match *self { + CreationError::Negative => "number is negative", + CreationError::Zero => "number is zero", + }; + f.write_str(description) + } +} + +impl error::Error for CreationError {} |
