hypershell_reqwest_components/providers/
headers.rs1use core::marker::PhantomData;
2
3use cgp::prelude::*;
4use hypershell_components::components::CanExtractStringArg;
5use hypershell_components::dsl::{Header, WithHeaders};
6use reqwest::RequestBuilder;
7use reqwest::header::{HeaderName, HeaderValue, InvalidHeaderName, InvalidHeaderValue};
8
9use crate::components::{
10 CanUpdateRequestBuilder, RequestBuilderUpdater, RequestBuilderUpdaterComponent,
11};
12
13#[cgp_new_provider]
14impl<Context, Key, Value> RequestBuilderUpdater<Context, Header<Key, Value>> for UpdateRequestHeader
15where
16 Context: CanExtractStringArg<Key>
17 + CanExtractStringArg<Value>
18 + CanRaiseError<InvalidHeaderName>
19 + CanRaiseError<InvalidHeaderValue>,
20{
21 fn update_request_builder(
22 context: &Context,
23 _phantom: PhantomData<Header<Key, Value>>,
24 builder: RequestBuilder,
25 ) -> Result<RequestBuilder, Context::Error> {
26 let key_str = context.extract_string_arg(PhantomData::<Key>);
27 let value_str = context.extract_string_arg(PhantomData::<Value>);
28
29 let key = HeaderName::from_bytes(key_str.as_bytes()).map_err(Context::raise_error)?;
30
31 let value = HeaderValue::from_bytes(value_str.as_bytes()).map_err(Context::raise_error)?;
32
33 Ok(builder.header(key, value))
34 }
35}
36
37pub struct UpdateRequestHeaders;
38
39#[cgp_provider]
40impl<Context, Arg, Args> RequestBuilderUpdater<Context, WithHeaders<Cons<Arg, Args>>>
41 for UpdateRequestHeaders
42where
43 Context: CanUpdateRequestBuilder<Arg>,
44 Self: RequestBuilderUpdater<Context, WithHeaders<Args>>,
45{
46 fn update_request_builder(
47 context: &Context,
48 _phantom: PhantomData<WithHeaders<Cons<Arg, Args>>>,
49 builder: RequestBuilder,
50 ) -> Result<RequestBuilder, Context::Error> {
51 let builder = context.update_request_builder(PhantomData, builder)?;
52 let builder =
53 Self::update_request_builder(context, PhantomData::<WithHeaders<Args>>, builder)?;
54
55 Ok(builder)
56 }
57}
58
59#[cgp_provider]
60impl<Context> RequestBuilderUpdater<Context, WithHeaders<Nil>> for UpdateRequestHeaders
61where
62 Context: HasErrorType,
63{
64 fn update_request_builder(
65 _context: &Context,
66 _phantom: PhantomData<WithHeaders<Nil>>,
67 builder: RequestBuilder,
68 ) -> Result<RequestBuilder, Context::Error> {
69 Ok(builder)
70 }
71}