1use alloc::{borrow::Cow, boxed::Box, string::String, vec::Vec};
2use bytes::Bytes;
3use bytestr::ByteStr;
4use core::pin::Pin;
5use futures_lite::AsyncBufRead;
6
7use super::{Body, BodyInner};
8
9macro_rules! from_bytes {
10 ($($ty:ty),*) => {
11 $(
12 impl From<$ty> for Body {
13 fn from(data: $ty) -> Self {
14 Body::from_bytes(data)
15 }
16 }
17 )*
18 };
19}
20
21macro_rules! from_str {
22 ($($ty:ty),*) => {
23 $(
24 impl From<$ty> for Body {
25 fn from(data: $ty) -> Self {
26 Body::from_text(data)
27 }
28 }
29 )*
30 };
31}
32
33from_str!(ByteStr, String, Box<str>, &str, Cow<'_, str>);
34
35from_bytes!(Bytes, Vec<u8>, Box<[u8]>);
36
37impl<'a> From<Cow<'a, [u8]>> for Body {
38 fn from(data: Cow<[u8]>) -> Self {
39 Body::from_bytes(data.into_owned())
40 }
41}
42
43impl From<&[u8]> for Body {
44 fn from(data: &[u8]) -> Self {
45 Body::from_bytes(data.to_vec())
46 }
47}
48
49impl From<Box<dyn AsyncBufRead + Send + Sync + 'static>> for Body {
50 fn from(reader: Box<dyn AsyncBufRead + Send + Sync + 'static>) -> Self {
51 Pin::from(reader).into()
52 }
53}
54
55impl From<Pin<Box<dyn AsyncBufRead + Send + Sync + 'static>>> for Body {
56 fn from(reader: Pin<Box<dyn AsyncBufRead + Send + Sync + 'static>>) -> Self {
57 Self {
58 mime: None,
59 inner: BodyInner::Reader {
60 reader,
61 length: None,
62 },
63 }
64 }
65}