#[macro_export]
#[doc(hidden)]
macro_rules! _function_path {
() => {{
fn f() {}
fn type_name_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
let name = type_name_of(f);
name.trim_end_matches("::f")
.trim_end_matches("::{{closure}}")
}};
}
#[macro_export]
macro_rules! send {
($req:expr) => {
$crate::send!($req, $crate::Auto, ())
};
($req:expr, ()) => {
async {
let _ = $crate::__internal::send(
$req,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
Ok(())
}
};
($req:expr, Body) => {
async {
$crate::__internal::send(
$req,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
true,
),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, Json) => {
$crate::send!($req, $crate::Json, ())
};
($req:expr, Xml) => {
$crate::send!($req, $crate::Xml, ())
};
($req:expr, Text) => {
$crate::send!($req, $crate::Text, ())
};
($req:expr, $parser:ty, ()) => {
async {
let result = $crate::__internal::send(
$req,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, Json<$ve:ty>) => {
$crate::send!($req, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $ve:ty) => {
$crate::send!($req, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $parser:ty, $vet:ty, $ve:ty) => {
async {
use $vet;
let result = $crate::__internal::send(
$req,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
<$ve>::require_headers(),
),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_with {
($req:expr, $config:expr) => {
$crate::_send_with!($req, $crate::Auto, (), $config)
};
($req:expr, (), $config:expr) => {
async {
let _ = $crate::__internal::send($req, $config.merge($crate::_function_path!(), false))
.await?;
Ok(())
}
};
($req:expr, Body, $config:expr) => {
async {
$crate::__internal::send($req, $config.merge($crate::_function_path!(), true))
.await
.and_then(|c| c.try_into())
}
};
($req:expr, Json, $config:expr) => {
$crate::_send_with!($req, $crate::Json, (), $config)
};
($req:expr, Xml, $config:expr) => {
$crate::_send_with!($req, $crate::Xml, (), $config)
};
($req:expr, Text, $config:expr) => {
$crate::_send_with!($req, $crate::Text, (), $config)
};
($req:expr, $parser:ty, (), $config:expr) => {
async {
let result =
$crate::__internal::send($req, $config.merge($crate::_function_path!(), false))
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, Json<$ve:ty>, $config:expr) => {
$crate::_send_with!($req, $crate::Json, $crate::JsonExtractor, $ve, $config)
};
($req:expr, $ve:ty, $config:expr) => {
$crate::_send_with!($req, $crate::Json, $crate::JsonExtractor, $ve, $config)
};
($req:expr, $parser:ty, $vet:ty, $ve:ty, $config:expr) => {
async {
use $vet;
let result = $crate::__internal::send(
$req,
$config.merge($crate::_function_path!(), <$ve>::require_headers()),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
macro_rules! send_json {
($req:expr, $json:expr) => {
$crate::send_json!($req, $json, $crate::Auto, ())
};
($req:expr, $json:expr, ()) => {
async {
let _ = $crate::__internal::send_json(
$req,
&($json),
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
Ok(())
}
};
($req:expr, $json:expr, Body) => {
async {
$crate::__internal::send_json(
$req,
&($json),
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
true,
),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, $json:expr, Json) => {
$crate::send_json!($req, $json, $crate::Json, ())
};
($req:expr, $json:expr, Xml) => {
$crate::send_json!($req, $json, $crate::Xml, ())
};
($req:expr, $json:expr, Text) => {
$crate::send_json!($req, $json, $crate::Text, ())
};
($req:expr, $json:expr, $parser:ty, ()) => {
async {
let result = $crate::__internal::send_json(
$req,
&($json),
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, $json:expr, Json<$ve:ty>) => {
$crate::send_json!($req, $json, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $json:expr, $ve:ty) => {
$crate::send_json!($req, $json, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $json:expr, $parser:ty, $vet:ty, $ve:ty) => {
async {
use $vet;
let result = $crate::__internal::send_json(
$req,
&($json),
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
<$ve>::require_headers(),
),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_json_with {
($req:expr, $json:expr, $config:expr) => {
$crate::_send_json_with!($req, $json, $crate::Auto, (), $config)
};
($req:expr, $json:expr, (), $config:expr) => {
async {
let _ = $crate::__internal::send_json(
$req,
&($json),
$config.merge($crate::_function_path!(), false),
)
.await?;
Ok(())
}
};
($req:expr, $json:expr, Body, $config:expr) => {
async {
$crate::__internal::send_json(
$req,
&($json),
$config.merge($crate::_function_path!(), true),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, $json:expr, Json, $config:expr) => {
$crate::_send_json_with!($req, $json, $crate::Json, (), $config)
};
($req:expr, $json:expr, Xml, $config:expr) => {
$crate::_send_json_with!($req, $json, $crate::Xml, (), $config)
};
($req:expr, $json:expr, Text, $config:expr) => {
$crate::_send_json_with!($req, $json, $crate::Text, (), $config)
};
($req:expr, $json:expr, $parser:ty, (), $config:expr) => {
async {
let result = $crate::__internal::send_json(
$req,
&($json),
$config.merge($crate::_function_path!(), false),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, $json:expr, Json<$ve:ty>, $config:expr) => {
$crate::_send_json_with!(
$req,
$json,
$crate::Json,
$crate::JsonExtractor,
$ve,
$config
)
};
($req:expr, $json:expr, $ve:ty, $config:expr) => {
$crate::_send_json_with!(
$req,
$json,
$crate::Json,
$crate::JsonExtractor,
$ve,
$config
)
};
($req:expr, $json:expr, $parser:ty, $vet:ty, $ve:ty, $config:expr) => {
async {
use $vet;
let result = $crate::__internal::send_json(
$req,
&($json),
$config.merge($crate::_function_path!(), <$ve>::require_headers()),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
macro_rules! send_xml {
($req:expr, $xml:expr) => {
$crate::send_xml!($req, $xml, $crate::Auto, ())
};
($req:expr, $xml:expr, ()) => {
async {
let _ = $crate::__internal::send_xml(
$req,
&($xml),
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
Ok(())
}
};
($req:expr, $xml:expr, Body) => {
async {
$crate::__internal::send_xml(
$req,
&($xml),
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
true,
),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, $xml:expr, Json) => {
$crate::send_xml!($req, $xml, $crate::Json, ())
};
($req:expr, $xml:expr, Xml) => {
$crate::send_xml!($req, $xml, $crate::Xml, ())
};
($req:expr, $xml:expr, Text) => {
$crate::send_xml!($req, $xml, $crate::Text, ())
};
($req:expr, $xml:expr, $parser:ty, ()) => {
async {
let result = $crate::__internal::send_xml(
$req,
&($xml),
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, $xml:expr, Json<$ve:ty>) => {
$crate::send_xml!($req, $xml, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $xml:expr, $ve:ty) => {
$crate::send_xml!($req, $xml, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $xml:expr, $parser:ty, $vet:ty, $ve:ty) => {
async {
use $vet;
let result = $crate::__internal::send_xml(
$req,
&($xml),
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
<$ve>::require_headers(),
),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_xml_with {
($req:expr, $xml:expr, $config:expr) => {
$crate::_send_xml_with!($req, $xml, $crate::Auto, (), $config)
};
($req:expr, $xml:expr, (), $config:expr) => {
async {
let _ = $crate::__internal::send_xml(
$req,
&($xml),
$config.merge($crate::_function_path!(), false),
)
.await?;
Ok(())
}
};
($req:expr, $xml:expr, Body, $config:expr) => {
async {
$crate::__internal::send_xml(
$req,
&($xml),
$config.merge($crate::_function_path!(), true),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, $xml:expr, Json, $config:expr) => {
$crate::_send_xml_with!($req, $xml, $crate::Json, (), $config)
};
($req:expr, $xml:expr, Xml, $config:expr) => {
$crate::_send_xml_with!($req, $xml, $crate::Xml, (), $config)
};
($req:expr, $xml:expr, Text, $config:expr) => {
$crate::_send_xml_with!($req, $xml, $crate::Text, (), $config)
};
($req:expr, $xml:expr, $parser:ty, (), $config:expr) => {
async {
let result = $crate::__internal::send_xml(
$req,
&($xml),
$config.merge($crate::_function_path!(), false),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, $xml:expr, Json<$ve:ty>, $config:expr) => {
$crate::_send_xml_with!(
$req,
$xml,
$crate::Json,
$crate::JsonExtractor,
$ve,
$config
)
};
($req:expr, $xml:expr, $ve:ty, $config:expr) => {
$crate::_send_xml_with!(
$req,
$xml,
$crate::Json,
$crate::JsonExtractor,
$ve,
$config
)
};
($req:expr, $xml:expr, $parser:ty, $vet:ty, $ve:ty, $config:expr) => {
async {
use $vet;
let result = $crate::__internal::send_xml(
$req,
&($xml),
$config.merge($crate::_function_path!(), <$ve>::require_headers()),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
macro_rules! send_form {
($req:expr, $form:expr) => {
$crate::send_form!($req, $form, $crate::Auto, ())
};
($req:expr, $form:expr, ()) => {
async {
let _ = $crate::__internal::send_form(
$req,
$form,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
Ok(())
}
};
($req:expr, $form:expr, Body) => {
async {
$crate::__internal::send_form(
$req,
$form,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
true,
),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, $form:expr, Json) => {
$crate::send_form!($req, $form, $crate::Json, ())
};
($req:expr, $form:expr, Xml) => {
$crate::send_form!($req, $form, $crate::Xml, ())
};
($req:expr, $form:expr, Text) => {
$crate::send_form!($req, $form, $crate::Text, ())
};
($req:expr, $form:expr, $parser:ty, ()) => {
async {
let result = $crate::__internal::send_form(
$req,
$form,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, $form:expr, Json<$ve:ty>) => {
$crate::send_form!($req, $form, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $form:expr, $ve:ty) => {
$crate::send_form!($req, $form, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $form:expr, $parser:ty, $vet:ty, $ve:ty) => {
async {
use $vet;
let result = $crate::__internal::send_form(
$req,
$form,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
<$ve>::require_headers(),
),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_form_with {
($req:expr, $form:expr, $config:expr) => {
$crate::_send_form_with!($req, $form, $crate::Auto, (), $config)
};
($req:expr, $form:expr, (), $config:expr) => {
async {
let _ = $crate::__internal::send_form(
$req,
$form,
$config.merge($crate::_function_path!(), false),
)
.await?;
Ok(())
}
};
($req:expr, $form:expr, Body, $config:expr) => {
async {
$crate::__internal::send_form(
$req,
$form,
$config.merge($crate::_function_path!(), true),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, $form:expr, Json, $config:expr) => {
$crate::_send_form_with!($req, $form, $crate::Json, (), $config)
};
($req:expr, $form:expr, Xml, $config:expr) => {
$crate::_send_form_with!($req, $form, $crate::Xml, (), $config)
};
($req:expr, $form:expr, Text, $config:expr) => {
$crate::_send_form_with!($req, $form, $crate::Text, (), $config)
};
($req:expr, $form:expr, $parser:ty, (), $config:expr) => {
async {
let result = $crate::__internal::send_form(
$req,
$form,
$config.merge($crate::_function_path!(), false),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, $form:expr, Json<$ve:ty>, $config:expr) => {
$crate::_send_form_with!(
$req,
$form,
$crate::Json,
$crate::JsonExtractor,
$ve,
$config
)
};
($req:expr, $form:expr, $ve:ty, $config:expr) => {
$crate::_send_form_with!(
$req,
$form,
$crate::Json,
$crate::JsonExtractor,
$ve,
$config
)
};
($req:expr, $form:expr, $parser:ty, $vet:ty, $ve:ty, $config:expr) => {
async {
use $vet;
let result = $crate::__internal::send_form(
$req,
$form,
$config.merge($crate::_function_path!(), <$ve>::require_headers()),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
macro_rules! send_multipart {
($req:expr, $form:expr) => {
$crate::send_multipart!($req, $form, $crate::Auto, ())
};
($req:expr, $form:expr, ()) => {
async {
let _ = $crate::__internal::send_multipart(
$req,
$form,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
Ok(())
}
};
($req:expr, $form:expr, Body) => {
async {
$crate::__internal::send_multipart(
$req,
$form,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
true,
),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, $form:expr, Json) => {
$crate::send_multipart!($req, $form, $crate::Json, ())
};
($req:expr, $form:expr, Xml) => {
$crate::send_multipart!($req, $form, $crate::Xml, ())
};
($req:expr, $form:expr, Text) => {
$crate::send_multipart!($req, $form, $crate::Text, ())
};
($req:expr, $form:expr, $parser:ty, ()) => {
async {
let result = $crate::__internal::send_multipart(
$req,
$form,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, $form:expr, Json<$ve:ty>) => {
$crate::send_multipart!($req, $form, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $form:expr, $ve:ty) => {
$crate::send_multipart!($req, $form, $crate::Json, $crate::JsonExtractor, $ve)
};
($req:expr, $form:expr, $parser:ty, $vet:ty, $ve:ty) => {
async {
use $vet;
let result = $crate::__internal::send_multipart(
$req,
$form,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
<$ve>::require_headers(),
),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_multipart_with {
($req:expr, $form:expr, $config:expr) => {
$crate::_send_multipart_with!($req, $form, $crate::Auto, (), $config)
};
($req:expr, $form:expr, (), $config:expr) => {
async {
let _ = $crate::__internal::send_multipart(
$req,
$form,
$config.merge($crate::_function_path!(), false),
)
.await?;
Ok(())
}
};
($req:expr, $form:expr, Body, $config:expr) => {
async {
$crate::__internal::send_multipart(
$req,
$form,
$config.merge($crate::_function_path!(), true),
)
.await
.and_then(|c| c.try_into())
}
};
($req:expr, $form:expr, Json, $config:expr) => {
$crate::_send_multipart_with!($req, $form, $crate::Json, (), $config)
};
($req:expr, $form:expr, Xml, $config:expr) => {
$crate::_send_multipart_with!($req, $form, $crate::Xml, (), $config)
};
($req:expr, $form:expr, Text, $config:expr) => {
$crate::_send_multipart_with!($req, $form, $crate::Text, (), $config)
};
($req:expr, $form:expr, $parser:ty, (), $config:expr) => {
async {
let result = $crate::__internal::send_multipart(
$req,
$form,
$config.merge($crate::_function_path!(), false),
)
.await?;
<$parser>::try_parse(result)
}
};
($req:expr, $form:expr, Json<$ve:ty>, $config:expr) => {
$crate::_send_multipart_with!(
$req,
$form,
$crate::Json,
$crate::JsonExtractor,
$ve,
$config
)
};
($req:expr, $form:expr, $ve:ty, $config:expr) => {
$crate::_send_multipart_with!(
$req,
$form,
$crate::Json,
$crate::JsonExtractor,
$ve,
$config
)
};
($req:expr, $form:expr, $parser:ty, $vet:ty, $ve:ty, $config:expr) => {
async {
use $vet;
let result = $crate::__internal::send_multipart(
$req,
$form,
$config.merge($crate::_function_path!(), <$ve>::require_headers()),
)
.await?;
let result = <$parser>::try_parse::<$ve>(result)?;
<$ve>::try_extract(result)
}
};
}
#[macro_export]
macro_rules! send_raw {
($req:expr) => {
$crate::__internal::send_raw(
$req,
$crate::__internal::RequestConfigurator::new(
$crate::_function_path!(),
None::<bool>,
false,
),
)
};
}
#[cfg(test)]
mod tests {
#[test]
fn test_trim_tail() {
let s = "module::file::{{closure}}::{{closure}}";
let o = s.trim_end_matches("::{{closure}}");
println!("{o}");
}
}