hypershell_components/providers/
url_arg.rs1use 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}