server_fn/response/
mod.rs

1/// Response types for Actix.
2#[cfg(feature = "actix")]
3pub mod actix;
4/// Response types for the browser.
5#[cfg(feature = "browser")]
6pub mod browser;
7#[cfg(feature = "generic")]
8pub mod generic;
9/// Response types for Axum.
10#[cfg(feature = "axum-no-default")]
11pub mod http;
12/// Response types for [`reqwest`].
13#[cfg(feature = "reqwest")]
14pub mod reqwest;
15
16use bytes::Bytes;
17use futures::Stream;
18use std::future::Future;
19
20/// Represents the response as created by the server;
21pub trait TryRes<E>
22where
23    Self: Sized,
24{
25    /// Attempts to convert a UTF-8 string into an HTTP response.
26    fn try_from_string(content_type: &str, data: String) -> Result<Self, E>;
27
28    /// Attempts to convert a binary blob represented as bytes into an HTTP response.
29    fn try_from_bytes(content_type: &str, data: Bytes) -> Result<Self, E>;
30
31    /// Attempts to convert a stream of bytes into an HTTP response.
32    fn try_from_stream(
33        content_type: &str,
34        data: impl Stream<Item = Result<Bytes, E>> + Send + 'static,
35    ) -> Result<Self, E>;
36}
37
38/// Represents the response as created by the server;
39pub trait Res {
40    /// Converts an error into a response, with a `500` status code and the error text as its body.
41    fn error_response(path: &str, err: String) -> Self;
42
43    /// Redirect the response by setting a 302 code and Location header.
44    fn redirect(&mut self, path: &str);
45}
46
47/// Represents the response as received by the client.
48pub trait ClientRes<E> {
49    /// Attempts to extract a UTF-8 string from an HTTP response.
50    fn try_into_string(self) -> impl Future<Output = Result<String, E>> + Send;
51
52    /// Attempts to extract a binary blob from an HTTP response.
53    fn try_into_bytes(self) -> impl Future<Output = Result<Bytes, E>> + Send;
54
55    /// Attempts to extract a binary stream from an HTTP response.
56    fn try_into_stream(
57        self,
58    ) -> Result<impl Stream<Item = Result<Bytes, E>> + Send + Sync + 'static, E>;
59
60    /// HTTP status code of the response.
61    fn status(&self) -> u16;
62
63    /// Status text for the status code.
64    fn status_text(&self) -> String;
65
66    /// The `Location` header or (if none is set), the URL of the response.
67    fn location(&self) -> String;
68
69    /// Whether the response has the [`REDIRECT_HEADER`](crate::redirect::REDIRECT_HEADER) set.
70    fn has_redirect(&self) -> bool;
71}
72
73/// A mocked response type that can be used in place of the actual server response,
74/// when compiling for the browser.
75///
76/// ## Panics
77/// This always panics if its methods are called. It is used solely to stub out the
78/// server response type when compiling for the client.
79pub struct BrowserMockRes;
80
81impl<E> TryRes<E> for BrowserMockRes {
82    fn try_from_string(_content_type: &str, _data: String) -> Result<Self, E> {
83        unreachable!()
84    }
85
86    fn try_from_bytes(_content_type: &str, _data: Bytes) -> Result<Self, E> {
87        unreachable!()
88    }
89
90    fn try_from_stream(
91        _content_type: &str,
92        _data: impl Stream<Item = Result<Bytes, E>>,
93    ) -> Result<Self, E> {
94        unreachable!()
95    }
96}
97
98impl Res for BrowserMockRes {
99    fn error_response(_path: &str, _err: String) -> Self {
100        unreachable!()
101    }
102
103    fn redirect(&mut self, _path: &str) {
104        unreachable!()
105    }
106}