#[macro_export]
macro_rules! AsChangeset {
(
($table_name:ident)
$($body:tt)*
) => {
AsChangeset! {
($table_name, treat_none_as_null="false")
$($body)*
}
};
(
$args:tt
$(#[$ignore:meta])*
$(pub)* struct $($body:tt)*
) => {
AsChangeset! {
$args
$($body)*
}
};
(
($table_name:ident, treat_none_as_null=$treat_none_as_null:tt)
$struct_name:ident <$($lifetime:tt),*>
$body:tt $(;)*
) => {
__diesel_parse_struct_body! {
(
struct_name = $struct_name,
table_name = $table_name,
treat_none_as_null = $treat_none_as_null,
struct_ty = $struct_name<$($lifetime),*>,
lifetimes = ($($lifetime),*),
),
callback = AsChangeset,
body = $body,
}
};
(
($table_name:ident, treat_none_as_null=$treat_none_as_null:tt)
$struct_name:ident
$body:tt $(;)*
) => {
__diesel_parse_struct_body! {
(
struct_name = $struct_name,
table_name = $table_name,
treat_none_as_null = $treat_none_as_null,
struct_ty = $struct_name,
lifetimes = ('a),
),
callback = AsChangeset,
body = $body,
}
};
(
(
struct_name = $struct_name:ident,
table_name = $table_name:ident,
treat_none_as_null = $treat_none_as_null:tt,
$($headers:tt)*
),
fields = $fields:tt,
) => {
AsChangeset_construct_changeset_ty! {
(
fields = $fields,
struct_name = $struct_name,
table_name = $table_name,
treat_none_as_null = $treat_none_as_null,
$($headers)*
),
table_name = $table_name,
treat_none_as_null = $treat_none_as_null,
fields = $fields,
changeset_ty = (),
}
};
(
(
fields = [$({
column_name: $column_name:ident,
field_ty: $field_ty:ty,
field_kind: $field_kind:ident,
})+],
struct_name = $struct_name:ident,
$($headers:tt)*
),
changeset_ty = $changeset_ty:ty,
) => {
AsChangeset! {
$($headers)*
self_to_columns = $struct_name($(ref $column_name),+),
columns = ($($column_name, $field_kind),+),
field_names = [],
changeset_ty = $changeset_ty,
}
};
(
(
fields = [$({
field_name: $field_name:ident,
column_name: $column_name:ident,
field_ty: $field_ty:ty,
field_kind: $field_kind:ident,
})+],
struct_name = $struct_name:ident,
$($headers:tt)*
),
changeset_ty = $changeset_ty:ty,
) => {
AsChangeset! {
$($headers)*
self_to_columns = $struct_name { $($field_name: ref $column_name),+ },
columns = ($($column_name, $field_kind),+),
field_names = [$($field_name)+],
changeset_ty = $changeset_ty,
}
};
(
table_name = $table_name:ident,
treat_none_as_null = $treat_none_as_null:tt,
struct_ty = $struct_ty:ty,
lifetimes = ($($lifetime:tt),*),
self_to_columns = $self_to_columns:pat,
columns = ($($column_name:ident, $field_kind:ident),+),
field_names = $field_names:tt,
changeset_ty = $changeset_ty:ty,
) => {
__diesel_parse_as_item! {
impl<$($lifetime: 'update,)* 'update> $crate::query_builder::AsChangeset
for &'update $struct_ty
{
type Target = $table_name::table;
type Changeset = $changeset_ty;
#[allow(non_shorthand_field_patterns)]
fn as_changeset(self) -> Self::Changeset {
let $self_to_columns = *self;
($(
AsChangeset_column_expr!(
$table_name::$column_name,
$column_name,
none_as_null = $treat_none_as_null,
field_kind = $field_kind,
)
,)+)
}
}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! AsChangeset_construct_changeset_ty {
(
$headers:tt,
table_name = $table_name:ident,
treat_none_as_null = "false",
fields = [{
$(field_name: $field_name:ident,)*
column_name: $column_name:ident,
field_ty: Option<$field_ty:ty>,
field_kind: option,
} $($tail:tt)*],
changeset_ty = ($($changeset_ty:ty,)*),
) => {
AsChangeset_construct_changeset_ty! {
$headers,
table_name = $table_name,
treat_none_as_null = "false",
fields = [$($tail)*],
changeset_ty = ($($changeset_ty,)*
Option<$crate::expression::predicates::Eq<
$table_name::$column_name,
$crate::expression::bound::Bound<
<$table_name::$column_name as $crate::expression::Expression>::SqlType,
&'update $field_ty,
>,
>>,
),
}
};
(
$headers:tt,
table_name = $table_name:ident,
treat_none_as_null = $treat_none_as_null:tt,
fields = [{
$(field_name: $field_name:ident,)*
column_name: $column_name:ident,
field_ty: $field_ty:ty,
$($ignore:tt)*
} $($tail:tt)*],
changeset_ty = ($($changeset_ty:ty,)*),
) => {
AsChangeset_construct_changeset_ty! {
$headers,
table_name = $table_name,
treat_none_as_null = $treat_none_as_null,
fields = [$($tail)*],
changeset_ty = ($($changeset_ty,)*
$crate::expression::predicates::Eq<
$table_name::$column_name,
$crate::expression::bound::Bound<
<$table_name::$column_name as $crate::expression::Expression>::SqlType,
&'update $field_ty,
>,
>,
),
}
};
(
$headers:tt,
table_name = $table_name:ident,
treat_none_as_null = $treat_none_as_null:tt,
fields = [],
changeset_ty = $changeset_ty:ty,
) => {
AsChangeset!($headers, changeset_ty = $changeset_ty,);
}
}
#[doc(hidden)]
#[macro_export]
macro_rules! AsChangeset_column_expr {
(
$column:expr,
$field_access:expr,
none_as_null = "false",
field_kind = option,
) => {
$field_access.as_ref().map(|f| $column.eq(f))
};
(
$column:expr,
$field_access:expr,
$($args:tt)*
) => {
$column.eq($field_access)
};
}