switchy_http/
simulator.rs

1use std::{collections::BTreeMap, marker::PhantomData};
2
3use async_trait::async_trait;
4use bytes::Bytes;
5
6use crate::{
7    Error, GenericClient, GenericClientBuilder, GenericRequestBuilder, GenericResponse, Method,
8    StatusCode,
9};
10
11#[derive(Default)]
12pub struct Client;
13
14impl Client {
15    #[must_use]
16    pub const fn new() -> Self {
17        Self
18    }
19}
20
21impl GenericClient<crate::SimulatorRequestBuilder> for Client {
22    fn request(&self, _method: Method, _url: &str) -> crate::SimulatorRequestBuilder {
23        crate::RequestBuilderWrapper(RequestBuilder, PhantomData)
24    }
25}
26
27pub struct ClientBuilder;
28
29impl crate::SimulatorClientBuilder {
30    #[must_use]
31    pub const fn new() -> Self {
32        Self(ClientBuilder, PhantomData, PhantomData)
33    }
34}
35
36impl GenericClientBuilder<crate::SimulatorRequestBuilder, crate::SimulatorClient>
37    for ClientBuilder
38{
39    fn build(self) -> Result<crate::SimulatorClient, Error> {
40        Ok(crate::ClientWrapper(Client, PhantomData))
41    }
42}
43
44pub struct RequestBuilder;
45
46#[async_trait]
47impl GenericRequestBuilder<crate::SimulatorResponse> for RequestBuilder {
48    fn header(&mut self, _name: &str, _value: &str) {}
49
50    fn body(&mut self, _body: Bytes) {}
51
52    #[cfg(feature = "json")]
53    fn form(&mut self, _form: &serde_json::Value) {}
54
55    async fn send(&mut self) -> Result<crate::SimulatorResponse, Error> {
56        Ok(crate::ResponseWrapper(Response::default()))
57    }
58}
59
60#[derive(Default)]
61pub struct Response {
62    headers: BTreeMap<String, String>,
63}
64
65#[async_trait]
66impl GenericResponse for Response {
67    #[must_use]
68    fn status(&self) -> StatusCode {
69        StatusCode::Ok
70    }
71
72    #[must_use]
73    fn headers(&mut self) -> &BTreeMap<String, String> {
74        &self.headers
75    }
76
77    #[must_use]
78    async fn text(&mut self) -> Result<String, Error> {
79        Ok(String::new())
80    }
81
82    #[must_use]
83    async fn bytes(&mut self) -> Result<Bytes, Error> {
84        Ok(Bytes::new())
85    }
86
87    #[must_use]
88    #[cfg(feature = "stream")]
89    fn bytes_stream(
90        &mut self,
91    ) -> std::pin::Pin<Box<dyn futures_core::Stream<Item = Result<Bytes, Error>> + Send>> {
92        Box::pin(futures_util::stream::empty())
93    }
94}