Главное, что меня раздражает это писать геты если руками и не автоматическая десериализация кортежных структур если с серде. Но второе менее неприятно, а может и решаемо. Идеал конечно автогенерация, но не нашел пока. Так что кажется лучшее, что есть это serde-rusqlite+refinery. Так как порожает меньше всего геморроя. В качестве автогенератора слоя примитивных моделей будет чатгопота, а далее компайл тайм во все поля...попробую.
Get опять же писать не надо, проблема в том, что автомапинги не времени компиляции, что неприятно.
Наверное все же попробую еще слой моделей для простой десериализации завести, автоматической, а из них уже собирать сложные внутренние. Хочется странного.
В итоге оказалось самое удобное просто все руками написать вместо автомаппингов, так как это просто надежнее и короче. Обычные запросы с именованными параметрами и обычные маппинги руками, либо придется городить вагон десериализаторов или промежуточных моделей. Не то что бы где-то по другому, но была надежда, что newtype хотя бы оно само проглотит, а оно не смогло это делать без доп пометок...что возня и не надо, так как тогда просто руками.
В итоге я так и не нашел удобного метода для кэшированного варианта, пришлось написать свой и юзать
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")
}
а для не кэшированого он есть :)
Теперь надо кэширование стейтментов наладить, там методы капец неудобные как раз в связи с конвертацией ошибок.
Единственное, что меня пока тормозит это волшебные преобразования типов, когда через два дереф был найден и вызван метод. Или когда тип ошибки надо один в другой преобразовать и хз как быстро это сделать без километра кода. С эти еще бывают затыки где долго ищу "простое решение".
Но serde сериализация и обратно и так для почти всех типов есть или ее можно легко сделать. Я десериализатор написал только что бы оперток не плодить
При этом десериализаторы писать элементарно, они автоматом фактически делаются.
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)
}
Может и макрос для совсем автомата накатать или найти.
Так и есть, 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") },
)
}
А вот так выглядит весь маппинг. Именнованные параметры есть, а выход мапится автоматом по совпадению имен...правда я еще не проверил работает ли :)
rusqlite+serde_ruslite легко решают все, что надо с автомапингами, при этом по дороге бесплатно есть сериализация и обратно если надо, куда угодно, не только с базой. Красота. Кажется.
Как выяснилось спустя два шага, дизель для хэловорда это больше гемора, а не меньше. Так как там надо адаптировать типы путем реализации кучи трейтов что бы автомаппинги работали, то есть написать другие маппинги только в десять раз длиннее, так что rusqlite, refinery и третья либа, которая распаковывает структуры в именованные параметры возвращаются.
Была мысль все к нему свести, но я пока не знаю возможно ли это, спеку читать надо, а ее я читать буду как РОС поднимется с колен.
Ну ладно, я еще хочу одно кв хранилище прикрутить, но пока не знаю зачем :) Оно мне просто понравилось, кэши собрался делать, а потом решил, что нахер мне кэши и выкинул сам подход, который переусложнял задачу в десять раз, а мне надо в одну харю.
Вообще, я бы продолжил впиливание дизеля, но надо что бы мозги постепенно решили, что спать пора. После дизеля, в целом останется вероятно десериализатор один для серде запилить хитрый...или нет, как пойдет. Шобы потом оно как-то там все само. И наверное можно доделать уже два самых важных эндпоинта, а то там раскуроченные заготовки лежат, в которых пятьдесят "а вот так если?". Но уже почти все готово к тому что бы нудно пилить по очереди. Никаких "ой хочу еще это" пока нет.
Заклинатель помоек
Медитирую, люблю смотреть научпоп лекции в ютубе, гулять. По субботам хожу в баню потом сижу в кондитерской и читаю. Обожаю музеи современного искусства. Предпочту посидеть у озера и посмотреть на горы. Этот инстанс мой. Еще есть канал https://youtube.com/@user-tc9eq9pz2q?si=uPmChHjU3UyZIDET
Демократы, либералы, либертарианцы, анархисты, исламисты, христиане и представители прочих религий никогда не перестанут конфликтовать до тех пор пока не поймут что добрососедские отношения намного ценнее всех их религий.
Я (с)