Так и есть, diesel только порождает кучу дурной работы.
pub fn get_user(username: &str) -> Result<UserDb> {
DB_POOL.get_connection()?.query_row_and_then(
sql_fabric::get_user_sql(),
named_params! {":username":username},
|row| -> Result<UserDb> { from_row::<UserDb>(row).context("Get user info error") },
)
}
А вот так выглядит весь маппинг. Именнованные параметры есть, а выход мапится автоматом по совпадению имен...правда я еще не проверил работает ли :)
При этом десериализаторы писать элементарно, они автоматом фактически делаются.
fn deserialize_language_identifier<'de, D>(deserializer: D) -> Result<LanguageIdentifier, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
Может и макрос для совсем автомата накатать или найти.
При этом десериализаторы писать элементарно, они автоматом фактически делаются.
fn deserialize_language_identifier<'de, D>(deserializer: D) -> Result<LanguageIdentifier, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}