use anyhow::{anyhow, Result};
use sqly::derive::*;
#[derive(Insert)]
#[sqly(table = "c33", dynamic)]
struct C33Insert {
first_name: &'static str,
last_name: &'static str,
#[sqly(optional)]
full_name: Option<&'static str>,
}
async fn c33_insert(obj: C33Insert, db: &sqlx::PgPool) -> Result<()> {
let (sql, args) = obj.insert_sql();
let query = C33Insert::insert_from((&sql, args));
query.execute(db).await?;
Ok(())
}
#[derive(Update)]
#[sqly(table = "c33", dynamic, optional)]
struct C33Update {
#[sqly(key)]
id: i32,
mother: Option<Option<i32>>,
father: Option<Option<i32>>,
}
async fn c33_update(obj: C33Update, db: &sqlx::PgPool) -> Result<()> {
if let Some((sql, args)) = obj.update_sql() {
let query = C33Update::update_from((&sql, args));
query.execute(db).await?;
Ok(())
} else {
Err(anyhow!("cannot perform update without fields"))
}
}
#[test]
fn c33_optional_args() {
let obj = C33Insert {
first_name: "one",
last_name: "two",
full_name: None, };
let (sql, args) = obj.insert_sql();
assert_eq!(
sql,
r#"
INSERT INTO c33 AS "self" (
"first_name",
"last_name"
) VALUES (
$1,
$2
)
"#
.trim_ascii()
);
let obj = C33Insert {
first_name: "one",
last_name: "two",
full_name: Some("twelve"), };
let (sql, args) = obj.insert_sql();
assert_eq!(
sql,
r#"
INSERT INTO c33 AS "self" (
"first_name",
"last_name",
"full_name"
) VALUES (
$1,
$2,
$3
)
"#
.trim_ascii()
);
let obj = C33Update {
id: 1,
mother: None, father: None, };
assert!(obj.update_sql().is_none());
let obj = C33Update {
id: 1,
mother: None, father: Some(Some(123)), };
let (sql, args) = obj.update_sql().unwrap();
assert_eq!(
sql,
r#"
UPDATE c33 AS "self"
SET
"father" = $1
WHERE
"id" = $2
"#
.trim_ascii()
);
let obj = C33Update {
id: 1,
mother: Some(Some(321)), father: Some(None), };
let (sql, args) = obj.update_sql().unwrap();
assert_eq!(
sql,
r#"
UPDATE c33 AS "self"
SET
"mother" = $1,
"father" = $2
WHERE
"id" = $3
"#
.trim_ascii()
);
}