use crate::binary::struct_trait::{send::Send, session::Session};
use std::convert::Infallible;
use std::net::SocketAddr;
use http_body_util::Full;
use hyper::body::Bytes;
use hyper::server::conn::http1;
use hyper::service::service_fn;
use hyper::{Request, Response};
use hyper_util::rt::TokioIo;
use tokio::net::TcpListener;
use std::error::Error;
use std::marker;
use std::panic;
#[cfg_attr(
doc_cfg,
doc(cfg(any(feature = "transport", feature = "transport_http")))
)]
pub fn send_http<T, S>(
x: T,
s: Send<T, S>,
http: bool,
method: Method,
uri: &str,
header: Vec<(&str, &str)>,
body: &'static str,
) -> Result<(S, ResponseFuture), Box<dyn Error>>
where
T: marker::Send,
S: Session,
{
let (here, there) = S::new();
let respfut = match http {
true => {
let mut temp = Request::builder().method(method).uri(uri);
for elt in header {
temp = temp.header(elt.0, elt.1);
}
let req = temp.body(Body::from(body))?;
let https = HttpsConnector::new();
let client = Client::builder().build::<_, Body>(https);
client.request(req)
}
false => {
let https = HttpsConnector::new();
let client = Client::builder().build::<_, Body>(https);
client.request(Request::default())
}
};
match s.channel.send((x, there)) {
Ok(_) => Ok((here, respfut)),
Err(e) => panic!("{}", e.to_string()),
}
}
#[macro_export]
#[cfg_attr(
doc_cfg,
doc(cfg(any(feature = "transport", feature = "transport_http")))
)]
macro_rules! create_send_http_session {
(
$func_name:ident,
$receiver:ident,
$sender:ident,
$meshedchannels_name:ident,
$n_sessions:literal,
$exclusion:literal
) => {
mpst_seq_proc::create_send_http_session!(
$func_name,
$receiver,
$sender,
$meshedchannels_name,
$n_sessions,
$exclusion
);
};
}
#[macro_export]
#[cfg_attr(
doc_cfg,
doc(cfg(any(feature = "transport", feature = "transport_http")))
)]
macro_rules! create_send_mpst_http_bundle {
($( $func_name: ident, $receiver: ident, $exclusion: literal | )+ => $sender: ident, $meshedchannels_name: ident, $n_sessions: literal) => {
$(
mpstthree::create_send_http_session!(
$func_name,
$receiver,
$sender,
$meshedchannels_name,
$n_sessions,
$exclusion
);
)+
}
}