use sqly::derive::*;
pub use std::borrow::Cow;
#[derive(Select)]
#[sqly(table = C24Table)]
struct C24Select {
id: i32,
}
#[derive(Table, PartialEq, Debug)]
#[sqly(flat, try_from_flat)]
#[sqly(table = "c24", from_row)]
struct C24Table {
id: i32,
#[sqly(default)]
count: i32,
#[sqly(default = unknown_name())] #[sqly(from = String)] name: Cow<'static, str>,
#[sqly(try_from = Option<String>)]
email: Email,
#[sqly(skip)]
empty: Vec<()>,
#[sqly(skip, default = vec![3, 3, 3])]
three: Vec<i32>, }
pub fn unknown_name() -> Cow<'static, str> {
Cow::Borrowed("UNKNOWN")
}
#[derive(Debug, PartialEq)]
pub struct Email(pub String);
#[derive(Debug)]
pub struct EmailError(&'static str);
impl TryFrom<Option<String>> for Email {
type Error = EmailError;
fn try_from(email: Option<String>) -> Result<Self, Self::Error> {
match email {
None => Err(EmailError("missing email")),
Some(email) => {
if email.is_empty() {
Err(EmailError("empty email"))
} else if !email.contains('@') {
Err(EmailError("missing @"))
} else {
Ok(Email(email))
}
}
}
}
}
mod c24 {}
#[test]
fn c24_default_from() {
let obj = C24Select { id: 4 };
let (sql, args) = obj.select_sql();
assert_eq!(
sql,
r#"
SELECT
"self"."id",
"self"."count",
"self"."name",
"self"."email"
FROM c24 AS "self"
WHERE
"self"."id" = $1
"#
.trim_ascii()
)
}