hermes_cli_components/impls/parse/
string.rs

1use core::marker::PhantomData;
2use core::str::FromStr;
3
4use cgp::prelude::*;
5
6use crate::traits::parse::ArgParser;
7
8pub struct ParseFromString<Parsed>(pub PhantomData<Parsed>);
9
10impl<App, Args, Tag, Parsed> ArgParser<App, Args, Tag> for ParseFromString<Parsed>
11where
12    App: CanRaiseError<Parsed::Err>,
13    Args: HasField<Tag, Field = String>,
14    Parsed: Async + FromStr,
15{
16    type Parsed = Parsed;
17
18    fn parse_arg(_app: &App, args: &Args, _tag: PhantomData<Tag>) -> Result<Parsed, App::Error> {
19        args.get_field(PhantomData)
20            .parse()
21            .map_err(App::raise_error)
22    }
23}
24
25pub struct ParseFromOptionalString<Parsed>(pub PhantomData<Parsed>);
26
27impl<App, Args, Tag, Parsed> ArgParser<App, Args, Tag> for ParseFromOptionalString<Parsed>
28where
29    App: CanRaiseError<Parsed::Err>,
30    Args: HasField<Tag, Field = Option<String>>,
31    Parsed: Async + FromStr,
32{
33    type Parsed = Option<Parsed>;
34
35    fn parse_arg(
36        _app: &App,
37        args: &Args,
38        _tag: PhantomData<Tag>,
39    ) -> Result<Option<Parsed>, App::Error> {
40        let m_field = args.get_field(PhantomData);
41
42        match m_field {
43            Some(field) => {
44                let parsed = field.parse().map_err(App::raise_error)?;
45
46                Ok(Some(parsed))
47            }
48            None => Ok(None),
49        }
50    }
51}