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}
20from_bytes!(Bytes, Vec<u8>, Box<[u8]>, ByteStr, String);
21
22impl<'a> From<Cow<'a, [u8]>> for Body {
23 fn from(data: Cow<[u8]>) -> Self {
24 Body::from_bytes(data.into_owned())
25 }
26}
27
28impl From<&[u8]> for Body {
29 fn from(data: &[u8]) -> Self {
30 Body::from_bytes(data.to_vec())
31 }
32}
33
34impl From<Box<str>> for Body {
35 fn from(data: Box<str>) -> Self {
36 Body::from_bytes(ByteStr::from(data))
37 }
38}
39
40impl<'a> From<Cow<'a, str>> for Body {
41 fn from(data: Cow<str>) -> Self {
42 data.as_bytes().into()
43 }
44}
45
46impl From<&str> for Body {
47 fn from(data: &str) -> Self {
48 data.as_bytes().into()
49 }
50}
51
52impl From<Box<dyn AsyncBufRead + Send + Sync + 'static>> for Body {
53 fn from(reader: Box<dyn AsyncBufRead + Send + Sync + 'static>) -> Self {
54 Pin::from(reader).into()
55 }
56}
57
58impl From<Pin<Box<dyn AsyncBufRead + Send + Sync + 'static>>> for Body {
59 fn from(reader: Pin<Box<dyn AsyncBufRead + Send + Sync + 'static>>) -> Self {
60 Self {
61 inner: BodyInner::Reader {
62 reader,
63 length: None,
64 },
65 }
66 }
67}