pub trait TypedBody {
type Body: RawBody<Data = Bytes> + Send + 'static;
// Required methods
fn content_type(&self) -> HeaderValue;
fn body(self) -> Self::Body;
}
Expand description
A trait that ties together a Response
body with
its expected Content-Type
header.
Check out Response::set_typed_body
for more details
on TypedBody
is leveraged when building a Response
.
§Implementing TypedBody
You might find yourself implementing TypedBody
if none of the implementations
provided out-of-the-box by Pavex in the body
module satisfies your needs.
You need to specify two things:
- The value of the
Content-Type
header - The low-level representation of your body type
Let’s focus on 2., the trickier bit. You’ll be working with the types in
the body::raw
module.
§Buffered body
Full<Bytes>
is the “canonical” choice if your body is fully
buffered in memory before being transmitted over the network.
You need to convert your body type into a buffer (Bytes
)
which is then wrapped in Full
to signal that the entire
body is a single “chunk”.
Let’s see how you could implement TypedBody
for a String
wrapper
as a reference example:
use pavex::http::HeaderValue;
use pavex::response::body::{
TypedBody,
raw::{Full, Bytes}
};
struct MyString(String);
impl TypedBody for MyString {
type Body = Full<Bytes>;
fn content_type(&self) -> HeaderValue {
HeaderValue::from_static("text/plain; charset=utf-8")
}
fn body(self) -> Self::Body {
Full::new(self.0.into())
}
}
§Streaming body
Streaming bodies are trickier.
You might need to implement RawBody
directly for your body type.
Required Associated Types§
Required Methods§
sourcefn content_type(&self) -> HeaderValue
fn content_type(&self) -> HeaderValue
The header value that should be used as Content-Type
when
returning this Response
.