hypershell_components/providers/
url_arg.rs

1use core::marker::PhantomData;
2use core::str::FromStr;
3
4use cgp::prelude::*;
5
6use crate::components::{
7    CanExtractStringArg, HasUrlType, UrlArgExtractor, UrlArgExtractorComponent,
8};
9use crate::dsl::FieldArg;
10
11#[cgp_new_provider]
12impl<Context, Arg> UrlArgExtractor<Context, Arg> for ExtractStringUrlArg
13where
14    Context: HasUrlType + CanExtractStringArg<Arg> + CanRaiseError<<Context::Url as FromStr>::Err>,
15    Context::Url: FromStr,
16{
17    fn extract_url_arg(
18        context: &Context,
19        phantom: PhantomData<Arg>,
20    ) -> Result<Context::Url, Context::Error> {
21        let url_str = context.extract_string_arg(phantom);
22        url_str.parse().map_err(Context::raise_error)
23    }
24}
25
26#[cgp_new_provider]
27impl<Context, Tag> UrlArgExtractor<Context, FieldArg<Tag>> for ExtractUrlFieldArg
28where
29    Context: HasUrlType + HasErrorType + HasField<Tag, Value = Context::Url>,
30    Context::Url: Clone,
31{
32    fn extract_url_arg(
33        context: &Context,
34        _phantom: PhantomData<FieldArg<Tag>>,
35    ) -> Result<Context::Url, Context::Error> {
36        Ok(context.get_field(PhantomData).clone())
37    }
38}