pub use ::include_sql::index_of;
#[macro_export]
#[doc(hidden)]
macro_rules! sql_literal {
($($name:ident)+ => $text:literal) => {
$text
};
($($name:ident)+ => $text:literal : $param:ident) => {
::std::concat!( $text, '$', $crate::util::index_of!($param in [ $( $name ),+ ] + 1) )
};
($($name:ident)+ => $text:literal : $param:ident $($tail:tt)+) => {
::std::concat!(
$text, '$', $crate::util::index_of!($param in [ $( $name ),+ ] + 1),
$crate::sql_literal!($($name)+ => $($tail)+)
)
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! num_args {
() => { 0 };
(: $head:ident $($tail:tt)*) => { 1 + $crate::num_args!($($tail)*) };
(# $head:ident $($tail:tt)*) => { $head.len() + $crate::num_args!($($tail)*) };
}
#[macro_export]
#[doc(hidden)]
macro_rules! sql_len {
() => { 0 };
($text:literal $($tail:tt)*) => { $text.len() + $crate::sql_len!($($tail)*) };
(: $head:ident $($tail:tt)*) => { 3 + $crate::sql_len!($($tail)*) };
(# $head:ident $($tail:tt)*) => { $head.len() * 5 + $crate::sql_len!($($tail)*) };
}
#[macro_export]
#[doc(hidden)]
macro_rules! dynamic_sql {
($stmt:ident $args:ident $i:ident) => {};
($stmt:ident $args:ident $i:ident $text:literal $($tail:tt)*) => {
$stmt.push_str($text);
$crate::dynamic_sql!($stmt $args $i $($tail)*);
};
($stmt:ident $args:ident $i:ident : $param:ident $($tail:tt)*) => {
$i += 1;
$stmt.push_str(&::std::format!("${}", $i));
$args.push(&$param);
$crate::dynamic_sql!($stmt $args $i $($tail)*);
};
($stmt:ident $args:ident $i:ident # $param:ident $($tail:tt)*) => {
let mut iter = $param.into_iter();
if let Some(arg) = iter.next() {
$i += 1;
$stmt.push_str(&::std::format!("${}", $i));
$args.push(arg);
while let Some(arg) = iter.next() {
$i += 1;
$stmt.push_str(&::std::format!(", ${}", $i));
$args.push(arg);
}
} else {
$stmt.push_str("NULL");
}
$crate::dynamic_sql!($stmt $args $i $($tail)*);
};
}