Struct ErrorContext

Source
pub struct ErrorContext<'a> { /* private fields */ }
Expand description

Collect context for creating an error

Implementations§

Source§

impl<'a> ErrorContext<'a>

Source

pub fn msg<M>(message: M) -> Self
where M: Display,

Create a new error object from a printable error message.

Examples found in repository?
examples/hello-error.rs (line 26)
9fn parse_args() -> Result<Args, String> {
10    #![allow(clippy::enum_glob_use)]
11    use lexarg_parser::Arg::*;
12
13    let mut thing = None;
14    let mut number = 1;
15    let mut shout = false;
16    let raw = std::env::args_os().collect::<Vec<_>>();
17    let mut parser = lexarg_parser::Parser::new(&raw);
18    let bin_name = parser
19        .next_raw()
20        .expect("nothing parsed yet so no attached lingering")
21        .expect("always at least one");
22    while let Some(arg) = parser.next_arg() {
23        match arg {
24            Short("n") | Long("number") => {
25                let value = parser.next_flag_value().ok_or_else(|| {
26                    ErrorContext::msg("missing required value")
27                        .within(arg)
28                        .to_string()
29                })?;
30                number = value
31                    .to_str()
32                    .ok_or_else(|| {
33                        ErrorContext::msg("invalid number")
34                            .unexpected(Value(value))
35                            .within(arg)
36                            .to_string()
37                    })?
38                    .parse()
39                    .map_err(|e| {
40                        ErrorContext::msg(e)
41                            .unexpected(Value(value))
42                            .within(arg)
43                            .to_string()
44                    })?;
45            }
46            Long("shout") => {
47                shout = true;
48            }
49            Value(val) if thing.is_none() => {
50                thing = Some(val.to_str().ok_or_else(|| {
51                    ErrorContext::msg("invalid string")
52                        .unexpected(arg)
53                        .to_string()
54                })?);
55            }
56            Short("h") | Long("help") => {
57                println!("Usage: hello [-n|--number=NUM] [--shout] THING");
58                std::process::exit(0);
59            }
60            _ => {
61                return Err(ErrorContext::msg("unexpected argument")
62                    .unexpected(arg)
63                    .to_string());
64            }
65        }
66    }
67
68    Ok(Args {
69        thing: thing
70            .ok_or_else(|| {
71                ErrorContext::msg("missing argument THING")
72                    .within(Value(bin_name))
73                    .to_string()
74            })?
75            .to_owned(),
76        number,
77        shout,
78    })
79}
Source

pub fn within(self, within: Arg<'a>) -> Self

Arg the error occurred within

Examples found in repository?
examples/hello-error.rs (line 27)
9fn parse_args() -> Result<Args, String> {
10    #![allow(clippy::enum_glob_use)]
11    use lexarg_parser::Arg::*;
12
13    let mut thing = None;
14    let mut number = 1;
15    let mut shout = false;
16    let raw = std::env::args_os().collect::<Vec<_>>();
17    let mut parser = lexarg_parser::Parser::new(&raw);
18    let bin_name = parser
19        .next_raw()
20        .expect("nothing parsed yet so no attached lingering")
21        .expect("always at least one");
22    while let Some(arg) = parser.next_arg() {
23        match arg {
24            Short("n") | Long("number") => {
25                let value = parser.next_flag_value().ok_or_else(|| {
26                    ErrorContext::msg("missing required value")
27                        .within(arg)
28                        .to_string()
29                })?;
30                number = value
31                    .to_str()
32                    .ok_or_else(|| {
33                        ErrorContext::msg("invalid number")
34                            .unexpected(Value(value))
35                            .within(arg)
36                            .to_string()
37                    })?
38                    .parse()
39                    .map_err(|e| {
40                        ErrorContext::msg(e)
41                            .unexpected(Value(value))
42                            .within(arg)
43                            .to_string()
44                    })?;
45            }
46            Long("shout") => {
47                shout = true;
48            }
49            Value(val) if thing.is_none() => {
50                thing = Some(val.to_str().ok_or_else(|| {
51                    ErrorContext::msg("invalid string")
52                        .unexpected(arg)
53                        .to_string()
54                })?);
55            }
56            Short("h") | Long("help") => {
57                println!("Usage: hello [-n|--number=NUM] [--shout] THING");
58                std::process::exit(0);
59            }
60            _ => {
61                return Err(ErrorContext::msg("unexpected argument")
62                    .unexpected(arg)
63                    .to_string());
64            }
65        }
66    }
67
68    Ok(Args {
69        thing: thing
70            .ok_or_else(|| {
71                ErrorContext::msg("missing argument THING")
72                    .within(Value(bin_name))
73                    .to_string()
74            })?
75            .to_owned(),
76        number,
77        shout,
78    })
79}
Source

pub fn unexpected(self, unexpected: Arg<'a>) -> Self

The failing Arg

Examples found in repository?
examples/hello-error.rs (line 34)
9fn parse_args() -> Result<Args, String> {
10    #![allow(clippy::enum_glob_use)]
11    use lexarg_parser::Arg::*;
12
13    let mut thing = None;
14    let mut number = 1;
15    let mut shout = false;
16    let raw = std::env::args_os().collect::<Vec<_>>();
17    let mut parser = lexarg_parser::Parser::new(&raw);
18    let bin_name = parser
19        .next_raw()
20        .expect("nothing parsed yet so no attached lingering")
21        .expect("always at least one");
22    while let Some(arg) = parser.next_arg() {
23        match arg {
24            Short("n") | Long("number") => {
25                let value = parser.next_flag_value().ok_or_else(|| {
26                    ErrorContext::msg("missing required value")
27                        .within(arg)
28                        .to_string()
29                })?;
30                number = value
31                    .to_str()
32                    .ok_or_else(|| {
33                        ErrorContext::msg("invalid number")
34                            .unexpected(Value(value))
35                            .within(arg)
36                            .to_string()
37                    })?
38                    .parse()
39                    .map_err(|e| {
40                        ErrorContext::msg(e)
41                            .unexpected(Value(value))
42                            .within(arg)
43                            .to_string()
44                    })?;
45            }
46            Long("shout") => {
47                shout = true;
48            }
49            Value(val) if thing.is_none() => {
50                thing = Some(val.to_str().ok_or_else(|| {
51                    ErrorContext::msg("invalid string")
52                        .unexpected(arg)
53                        .to_string()
54                })?);
55            }
56            Short("h") | Long("help") => {
57                println!("Usage: hello [-n|--number=NUM] [--shout] THING");
58                std::process::exit(0);
59            }
60            _ => {
61                return Err(ErrorContext::msg("unexpected argument")
62                    .unexpected(arg)
63                    .to_string());
64            }
65        }
66    }
67
68    Ok(Args {
69        thing: thing
70            .ok_or_else(|| {
71                ErrorContext::msg("missing argument THING")
72                    .within(Value(bin_name))
73                    .to_string()
74            })?
75            .to_owned(),
76        number,
77        shout,
78    })
79}

Trait Implementations§

Source§

impl<'a> Debug for ErrorContext<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for ErrorContext<'_>

Source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<E> From<E> for ErrorContext<'_>
where E: Error + Send + Sync + 'static,

Source§

fn from(error: E) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<'a> Freeze for ErrorContext<'a>

§

impl<'a> RefUnwindSafe for ErrorContext<'a>

§

impl<'a> Send for ErrorContext<'a>

§

impl<'a> Sync for ErrorContext<'a>

§

impl<'a> Unpin for ErrorContext<'a>

§

impl<'a> UnwindSafe for ErrorContext<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<!> for T

Source§

fn from(t: !) -> T

Converts to this type from the input type.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.