http_kit/body/
convert.rs

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}