Примерно 8 месяцев назад я написал на Rust pet-проект, который пытается быть подобием Hibernate в экосистеме Java. Я даже опубликовал его в качестве Open Source, но получил негативный отзыв и удалил его с GitHub.
Сейчас я решил вернуться к этому проекту, но подойти к нему с другой стороны. Я бы хотел услышать идеи по проекту от опытных разработчиков на Rust. Что в моем проекте сделано не в идиоматическом стиле Rust и т.д. и т.п. В общем, хочется получить чек-лист того, что в проекте не так и как это исправить.
Пожалуйста, помогите. Мне очень нужна ваша обратная связь.
Код проекта на GitHub.
Комментарии (14)
feelamee
25.04.2024 21:59мистер
расскажите, откуда у вас столько времени, чтобы вести все эти опен сорс проекты?
не думаете ведь вы, что сообщество будет развивать их само по себе, пока вы будете с улыбкой на лице наблюдать, как одна за другой появляются звёздочки на гитхабе?
mxr
25.04.2024 21:59+4В том случае, если вопросы финансового характера остро не стоят, у человека появляется уйма свободного времени.
Есть целый пласт людей, например инди-хакеры, готовых инвестировать свое время в потенциально интересный но не прибыльный проект.
В моем случае, open source стал отличным способ изучать языки и технологии.
itmind
25.04.2024 21:59+14Это не статья, а просто ссылка на Github. Еще и хабы выбраны про программирование, а в статье ни одной строчки кода.
В статье нужно описать, чем ваше решение лучше аналогов (Diesel, SeaORM, Sqlx), какие походы использовали, с какими трудностями столкнулись, в чем подобие именно Hibernate и т.п.
igumnov Автор
25.04.2024 21:59Вы можете найти это все в моей предыдущей статье: https://habr.com/ru/articles/757070/
Melanchall
25.04.2024 21:59+5А кроме того стоит уровень статьи Средний. Уровень это про текст статьи, но в статье (если это вообще статьёй можно назвать) нет ничего требующего навыков отличных от навыка чтения.
Также замечу, что существует сайт Code Review Stack Exchange, созданный специально с целью помогать ревьювить код и помогать с кодом в плане архитетуры, стиля и всего такого. Я подозреваю, что автору нужно было написать туда.
Dgolubetd
25.04.2024 21:59+2На основании примера:
(Не критицизм кода) ORM - никогда их не любил, но как способ попрактиковаться - OK
Почему метод connect почему-то блокирующий, в то время как всё остальное асинхронное?
Prepared statement нет? В примере format и protect - есть гарантии что он корректно всё заэскейпит?
conn.query(query.as_str()) - можно использовать AsRef чтобы можно было передовать строки в разной форме
-
Очень много клонирования. Можно принимать и ссылки. Ну а лучше разрешить и то и то, опять же с помощью AsRef
igumnov Автор
25.04.2024 21:59Оk
Сказать честно, не помню, толи просто сделал толи компилятор ругался так как либа в которой конекция создается выдавало ошибку про Send и Sync - надо перепроверить - спасибо за замечание
Да согласен, prepared statement не хватает вообщем как раз можно перейти на sqlx crate https://github.com/igumnoff/parvati/issues/1
Интересно, а это чуть медленнее работает?
Ну клонирование, точно не быстрое. Вот тут точно AsRef уместно. Надо заняться рефакторингом
domix32
25.04.2024 21:59+2ну из нечитаемого
вот такое
match value { Some(v_opt) => { match v_opt { None => { None } Some(v) => { let r = Z::from_str(v.as_str()); match r { Ok(res) => { Some(res) } Err(_) => { None } } } } } None => { None } }
Должно использовать идиому
if let Some(x)
/if let Ok(x)
.Аналогично но с циклом
while let Some(x)
.Две PhantomData в одной структуре выглядит как минимум подозрительно, как максимум бесполезно - лайфтайм у них один и тот же.
Преобразование ошибок выглядит не очень. Возможно стоит подсмотреть как используют какой-нибудь thiserror/anyhow либо сделать
impl Into/From
для ваших ошибок.Санация ввода определённо требует много тестов и вероятно выделение в собственную сущность или как минимум отдельный трейт с имплементацией для
char
,str
иString
, чтобы можно быо делать что-то вроде"praise the sun \0/".orm_escape()
.Сейчас тестов вроде примерно нисколько. Да и в общем по проекту тестов как-то мало. Отсюда же отсутствие понимания у людей как это будет использоваться в дальнейшем.
Про сериализацию наверное стоит подсмотреть какой-нибудь miniserde ибо текущий вариант кажется имплементит только какой-то сабсет json спеки. Ввиду отсутвия тестов - непонятно.
aegoroff
25.04.2024 21:59+1вот тут https://github.com/igumnoff/parvati/blob/3c3e6ff32872326bbef818192cc3d634962c9381/lib/src/sqlite.rs#L89 у вас прямо SQL инъекция в чистом виде - я вам еще в прошлый раз об этом говорил, но видимо вы не поняли. НЕЛЬЗЯ данные неизвестно откуда использовать в запросах напрямую, пусть даже с санитайзером, ТОЛЬКО передавая их через параметры.
igumnov Автор
25.04.2024 21:59Я понял - поэтому буду переписывать на sqlx с prepare statement
более того я про preapare statement знал и использовал 25 лет назад когда делал свой высоконогруженый веб сервис обслуживащий более 20 млн пользователей
а текущая либа это просто на коленке писаный прототип, быстрей - быстрей лишь бы скомпилировалось и работало
https://github.com/igumnoff/parvati/issues/1
Но вы молодец, что так упорно гнете свою линию )aegoroff
25.04.2024 21:59в 99 году сервис обслуживающий более 20 млн.? Это Яндекс, Рамблер, Апорт, Мейлру что-ли? И да, что у вас было за железо? в ту пору диск на 10 Гигов считался огромным, типичный было что-то вроде 4-8 Гб. Тогда наверно в России было ну 2-3 млн. пользователей интренета
igumnov Автор
25.04.2024 21:59сорри, ошибся, погуглите mylivepage проект он чуть позже был )
просто для меня это было как вчера ) и я плюс минус 5-10 лет не уточняю
https://igumnoff.com/about
Хотя мы с вами похожи, вы отвергаете авторитеты как и я, так как они стары как засохшая жвачка под партой в школе )
Gorthauer87
Ну вот сразу не хватает плашек, ведущих на crates.io и docs.rs. Без этого не удобно изучать проект, и нужно его отдельно искать где он опубликован.
Кстати, а чем sea orm не устроил?
igumnov Автор
SeaORM меня больше радует чем Diesel ) Но захотелось что-то свое написать, вдруг получиться решение где меньше букв надо писать чем в SeaORM.