Show newer

Сделаю макрос, я с ума сойду для каждого столько писать.

Show thread

Так что типы будут жирные по тексту, а не автомат.

#[derive(Debug, Serialize, Deserialize)]
#[serde(from = "String")]
pub struct PreferredUsername(pub String);

impl std::ops::Deref for PreferredUsername {
type Target = String;

fn deref(&self) -> &Self::Target {
&self.0
}
}

impl From<String> for PreferredUsername {
fn from(value: String) -> Self {
PreferredUsername(value)
}
}

Может я просто пока что то не понимаю.

Оказывается таки да, рускулайт серде не поддерживает кортежные структуры, там имен полей нет, но почему не поддерживает их в качестве значений, загадка. Нашел самое короткое решение

#[serde(from = "String")]

В итоге можно совсем мало потом написать, реализовать From<String> и много гетов можно не писать. При этом если тип внешний то можно десериализатор накатать все же. Это самое короткое, что можно так как для серде тоже надо. Короче увы нет решения кажется.

Show thread

Главное, что меня раздражает это писать геты если руками и не автоматическая десериализация кортежных структур если с серде. Но второе менее неприятно, а может и решаемо. Идеал конечно автогенерация, но не нашел пока. Так что кажется лучшее, что есть это serde-rusqlite+refinery. Так как порожает меньше всего геморроя. В качестве автогенератора слоя примитивных моделей будет чатгопота, а далее компайл тайм во все поля...попробую.

Show thread

Get опять же писать не надо, проблема в том, что автомапинги не времени компиляции, что неприятно.

Show thread

Наверное все же попробую еще слой моделей для простой десериализации завести, автоматической, а из них уже собирать сложные внутренние. Хочется странного.

Show thread

Но может я передумаю, все же serde_Rusqile неплохое решение, относительно.

Show thread

В итоге оказалось самое удобное просто все руками написать вместо автомаппингов, так как это просто надежнее и короче. Обычные запросы с именованными параметрами и обычные маппинги руками, либо придется городить вагон десериализаторов или промежуточных моделей. Не то что бы где-то по другому, но была надежда, что newtype хотя бы оно само проглотит, а оно не смогло это делать без доп пометок...что возня и не надо, так как тогда просто руками.

@skobkin @sattellite контору audeze купила контора сони, или собиралась.

В итоге я так и не нашел удобного метода для кэшированного варианта, пришлось написать свой и юзать

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")
}

а для не кэшированого он есть :)

Show thread

@sattellite @skobkin я в ютубе ролик с этим написал, так там у аудиофилов столько клепок с жоп посрывало, приятно видеть :)

@sattellite @skobkin их вроде сони купила, вот когда выйдут сониевые магнепланары на основе этого мусора, где все вылизано будет, можно будет брать. У них еще и шумоподавление не работает вовсе :)

@sattellite @skobkin у меня одизи уши есть, максвел их. Звучат хорошо, прочные, но софт у них говно. Например в линукс (не смотрел в винде) у этой игровой гарнитуры ты можешь либо выбрать хэндсфри с микрофоном, либо полноценный звук :) И прочее подобное. Я бы второй раз не брал. Но я не аудиофил, просто решил "купить крутое что бы посмотреть как там"...говно.

Теперь надо кэширование стейтментов наладить, там методы капец неудобные как раз в связи с конвертацией ошибок.

Show thread

Единственное, что меня пока тормозит это волшебные преобразования типов, когда через два дереф был найден и вызван метод. Или когда тип ошибки надо один в другой преобразовать и хз как быстро это сделать без километра кода. С эти еще бывают затыки где долго ищу "простое решение".

Show thread

Но serde сериализация и обратно и так для почти всех типов есть или ее можно легко сделать. Я десериализатор написал только что бы оперток не плодить

Show thread

При этом десериализаторы писать элементарно, они автоматом фактически делаются.

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)
}

Может и макрос для совсем автомата накатать или найти.

Show thread

Так и есть, 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") },
)
}

А вот так выглядит весь маппинг. Именнованные параметры есть, а выход мапится автоматом по совпадению имен...правда я еще не проверил работает ли :)

Show thread

rusqlite+serde_ruslite легко решают все, что надо с автомапингами, при этом по дороге бесплатно есть сериализация и обратно если надо, куда угодно, не только с базой. Красота. Кажется.

Show thread

Боже, благослови git и Торвальдса! Откатил два коммита назад что бы не вычищать дизель.

Show thread
Show older
MustUdon

I like Twitter, but, Mastodon it is so excited! Feel free to register it is server just for fun! Usefull links https://instances.social https://www.reddit.com/r/Mastodon/comments/yugh2o/some_useful_mastodon_lists/?utm_source=share&utm_medium=web2x&context=3