hermes_cli_components/impls/parse/
string.rs1use 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}