Как выяснилось спустя два шага, дизель для хэловорда это больше гемора, а не меньше. Так как там надо адаптировать типы путем реализации кучи трейтов что бы автомаппинги работали, то есть написать другие маппинги только в десять раз длиннее, так что rusqlite, refinery и третья либа, которая распаковывает структуры в именованные параметры возвращаются.
Так и есть, 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") },
)
}
А вот так выглядит весь маппинг. Именнованные параметры есть, а выход мапится автоматом по совпадению имен...правда я еще не проверил работает ли :)
Но serde сериализация и обратно и так для почти всех типов есть или ее можно легко сделать. Я десериализатор написал только что бы оперток не плодить
В итоге я так и не нашел удобного метода для кэшированного варианта, пришлось написать свой и юзать
pub fn get_user(username: &str) -> Result<UserDb> {
let conn = DB_POOL.get_connection()?;
let mut prepared = conn.prepare_cached(sql_fabric::get_user_sql())?;
get_single_entity(&mut prepared, params![username], from_row::<UserDb>)
.context("get user error")
}
а для не кэшированого он есть :)
Единственное, что меня пока тормозит это волшебные преобразования типов, когда через два дереф был найден и вызван метод. Или когда тип ошибки надо один в другой преобразовать и хз как быстро это сделать без километра кода. С эти еще бывают затыки где долго ищу "простое решение".