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}
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}