hypershell_reqwest_components/providers/
headers.rs

1use 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}