Skip to content

Commit a8a7f37

Browse files
authored
Merge pull request #4857 from Tibo-Ulens/fix/impl-aschangeset-on-ref-option
Implement AsChangeset on &Option<T>
2 parents 10ce9af + d70d843 commit a8a7f37

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

diesel/src/query_builder/update_statement/changeset.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ impl<T: AsChangeset> AsChangeset for Option<T> {
3838
}
3939
}
4040

41+
impl<'update, T> AsChangeset for &'update Option<T>
42+
where
43+
&'update T: AsChangeset,
44+
{
45+
type Target = <&'update T as AsChangeset>::Target;
46+
type Changeset = Option<<&'update T as AsChangeset>::Changeset>;
47+
48+
fn as_changeset(self) -> Self::Changeset {
49+
self.as_ref().map(AsChangeset::as_changeset)
50+
}
51+
}
52+
4153
impl<Left, Right> AsChangeset for Eq<Left, Right>
4254
where
4355
Left: AssignmentTarget,

diesel_derives/tests/as_changeset.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,3 +928,76 @@ fn skip_update() {
928928
assert_eq!(res.2, Some("green".into()));
929929
assert_eq!(res.3, Some("admin".into()));
930930
}
931+
932+
#[test]
933+
fn optional_embedded_struct() {
934+
#[derive(AsChangeset)]
935+
#[diesel(table_name = users)]
936+
struct UserAttributes<'a> {
937+
hair_color: &'a str,
938+
r#type: &'a str,
939+
}
940+
941+
#[derive(AsChangeset)]
942+
#[diesel(table_name = users)]
943+
struct UserForm<'a> {
944+
name: &'a str,
945+
#[diesel(embed)]
946+
attribute: Option<UserAttributes<'a>>,
947+
}
948+
949+
let connection = &mut connection_with_sean_and_tess_in_users_table();
950+
951+
update(users::table.find(1))
952+
.set(&UserForm {
953+
name: "Jim",
954+
attribute: Some(UserAttributes {
955+
hair_color: "blue",
956+
r#type: "super",
957+
}),
958+
})
959+
.execute(connection)
960+
.unwrap();
961+
962+
let expected = vec![
963+
(
964+
1,
965+
String::from("Jim"),
966+
Some(String::from("blue")),
967+
Some(String::from("super")),
968+
),
969+
(
970+
2,
971+
String::from("Tess"),
972+
Some(String::from("brown")),
973+
Some(String::from("admin")),
974+
),
975+
];
976+
let actual = users::table.order(users::id).load(connection);
977+
assert_eq!(Ok(expected), actual);
978+
979+
update(users::table.find(2))
980+
.set(&UserForm {
981+
name: "Tess",
982+
attribute: None,
983+
})
984+
.execute(connection)
985+
.unwrap();
986+
987+
let expected = vec![
988+
(
989+
1,
990+
String::from("Jim"),
991+
Some(String::from("blue")),
992+
Some(String::from("super")),
993+
),
994+
(
995+
2,
996+
String::from("Tess"),
997+
Some(String::from("brown")),
998+
Some(String::from("admin")),
999+
),
1000+
];
1001+
let actual = users::table.order(users::id).load(connection);
1002+
assert_eq!(Ok(expected), actual);
1003+
}

0 commit comments

Comments
 (0)