#[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::internal::_send(
$req,
$crate::internal::RequestConfigurator::new($crate::_function_path!(), None, true),
)
};
($req:expr, $extractor:ty) => {
async {
use $crate::JsonExtractor;
let result: serde_json::Value = $crate::internal::_send(
$req,
$crate::internal::RequestConfigurator::new(
$crate::_function_path!(),
None,
<$extractor>::require_headers(),
),
)
.await?;
<$extractor>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_with {
($req:expr, $config:expr) => {
$crate::internal::_send($req, $config.merge($crate::_function_path!(), true))
};
($req:expr, $extractor:ty, $config:expr) => {
async {
use $crate::JsonExtractor;
let result: serde_json::Value = $crate::internal::_send(
$req,
$config.merge($crate::_function_path!(), <$extractor>::require_headers()),
)
.await?;
<$extractor>::try_extract(result)
}
};
}
#[macro_export]
macro_rules! send_json {
($req:expr, $json:expr) => {
$crate::internal::_send_json(
$req,
&($json),
$crate::internal::RequestConfigurator::new($crate::_function_path!(), None, true),
)
};
($req:expr, $json:expr, $extractor:ty) => {
async {
use $crate::JsonExtractor;
let result: serde_json::Value = $crate::internal::_send_json(
$req,
&($json),
$crate::internal::RequestConfigurator::new(
$crate::_function_path!(),
None,
<$extractor>::require_headers(),
),
)
.await?;
<$extractor>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_json_with {
($req:expr, $json:expr, $config:expr) => {
$crate::internal::_send_json(
$req,
&($json),
$config.merge($crate::_function_path!(), true),
)
};
($req:expr, $json:expr, $extractor:ty, $config:expr) => {
async {
use $crate::JsonExtractor;
let result: serde_json::Value = $crate::internal::_send_json(
$req,
&($json),
$config.merge($crate::_function_path!(), <$extractor>::require_headers()),
)
.await?;
<$extractor>::try_extract(result)
}
};
}
#[macro_export]
macro_rules! send_form {
($req:expr, $form:expr) => {
$crate::internal::_send_form(
$req,
$form,
$crate::internal::RequestConfigurator::new($crate::_function_path!(), None, true),
)
};
($req:expr, $form:expr, $extractor:ty) => {
async {
use $crate::JsonExtractor;
let result: serde_json::Value = $crate::internal::_send_form(
$req,
$form,
$crate::internal::RequestConfigurator::new(
$crate::_function_path!(),
None,
<$extractor>::require_headers(),
),
)
.await?;
<$extractor>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_form_with {
($req:expr, $form:expr, $config:expr) => {
$crate::internal::_send_form($req, $form, $config.merge($crate::_function_path!(), true))
};
($req:expr, $form:expr, $extractor:ty, $config:expr) => {
async {
use $crate::JsonExtractor;
let result: serde_json::Value = $crate::internal::_send_form(
$req,
$form,
$config.merge($crate::_function_path!(), <$extractor>::require_headers()),
)
.await?;
<$extractor>::try_extract(result)
}
};
}
#[macro_export]
macro_rules! send_multipart {
($req:expr, $form:expr) => {
$crate::internal::_send_multipart(
$req,
$form,
$crate::internal::RequestConfigurator::new($crate::_function_path!(), None, true),
)
};
($req:expr, $form:expr, $extractor:ty) => {
async {
use $crate::JsonExtractor;
let result: serde_json::Value = $crate::internal::_send_multipart(
$req,
$form,
$crate::internal::RequestConfigurator::new(
$crate::_function_path!(),
None,
<$extractor>::require_headers(),
),
)
.await?;
<$extractor>::try_extract(result)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! _send_multipart_with {
($req:expr, $form:expr, $config:expr) => {
$crate::internal::_send_multipart(
$req,
$form,
$config.merge($crate::_function_path!(), true),
)
};
($req:expr, $form:expr, $extractor:ty, $config:expr) => {
async {
use $crate::JsonExtractor;
let result: serde_json::Value = $crate::internal::_send_multipart(
$req,
$form,
$config.merge($crate::_function_path!(), <$extractor>::require_headers()),
)
.await?;
<$extractor>::try_extract(result)
}
};
}
#[cfg(test)]
mod tests {
#[test]
fn test_trim_tail() {
let s = "module::file::{{closure}}::{{closure}}";
let o = s.trim_end_matches("::{{closure}}");
println!("{o}");
}
}