Size: a a a

Rust — русскоговорящее сообществo

2020 April 18

A

Alik in Rust — русскоговорящее сообществo
Gymmasssorla
thiserror, snafu
В телохиде что?
источник

G

Gymmasssorla in Rust — русскоговорящее сообществo
thiserror
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
Я вот буквально час назад расписывал внутреннее письмо почему нам надо на thiserror + anyhow переходить 😅
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
Краткое содержание: failure::Fail фу; std::error::Error наше все. failure::Fail в итоге раскололо экосистему, dyn Fail несовместим с dyn Error; поэтому, чем быстрее failure будет выжжен, тем лучше.
источник

G

Gymmasssorla in Rust — русскоговорящее сообществo
Ilya Lakhin
Привет! Можно посоветоваться по организации архитектуры библиотеки с фьючерсами?

Задача такая. Есть некий объект Factory, который создает некие экзампляры Instance, связанные с Factory. Инстансы создаются асинхронно. При этом инстансы связаны с Factory(используют некоторый стафф из них по ссылкам), и обычно имеют ограниченное время жизни. Также инстансы имеют асинхронные методы, для выполнения некой важной работы.

Мне нужно организовать архитектуру так, чтобы пользователь мог создавать свои собственные имплементации и Factory, и Instance. Кроме того, у обеих сущностей есть некое дефолтное поведение.

У меня что-то такое получилось, организовав Factory и Instance в виде трейтов с лайфтайм-ссылками, ассоциированными типами, и навесив на все это async_trait(а местами выведя дефолтные методы отдельно от трейтов, так как async_trait не справился с резолвом лайвтайм-границ как надо). Но это все получилось очень-очень громоздко. Как это можно сделать менее громоздко?
BoxFuture и вперёд, async-trait лишь усложняет поддержку кода
источник

K

Kitsu in Rust — русскоговорящее сообществo
Ivan Dubrov
Краткое содержание: failure::Fail фу; std::error::Error наше все. failure::Fail в итоге раскололо экосистему, dyn Fail несовместим с dyn Error; поэтому, чем быстрее failure будет выжжен, тем лучше.
источник

G

Gymmasssorla in Rust — русскоговорящее сообществo
Больше компатов богу компатов
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
Да, только цепочки-то не работают.
источник

A

Alik in Rust — русскоговорящее сообществo
То есть если хотим строгости thiserror. А если хотим просто по быстрому, то anyhow?
источник

K

Kitsu in Rust — русскоговорящее сообществo
а я напомню, что snafu, anyhow & thiserror в отличии от фейлуры не поддерживают no_std
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
std::error::Error::source возвращает &dyn std::error:🧼Error
источник

K

Kitsu in Rust — русскоговорящее сообществo
Alik
То есть если хотим строгости thiserror. А если хотим просто по быстрому, то anyhow?
thiserror + anyhow обычно в связке, это быстро и без заморочек
если структурировано то snafu
источник

A

Alik in Rust — русскоговорящее сообществo
Kitsu
thiserror + anyhow обычно в связке, это быстро и без заморочек
если структурировано то snafu
Я не понимаю как связывать их.
источник

A

Alik in Rust — русскоговорящее сообществo
Одно без типа, просто еррор с мессагой
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
Поэтому Fail::compat(fail).source() вернет None.
источник

A

Alik in Rust — русскоговорящее сообществo
Другое конкретный тип
источник

K

Kitsu in Rust — русскоговорящее сообществo
ну thiserror дает derive(Error), anyhow дает возможность работы с std::error::Error (bail, context, etc)
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
Ну, у нас наверху, в приложениее — failure::Error (аналог anyhow::Error`). Внизу, в библиотеках, `derive(Fail) (аналог `thiserror::Error`).
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
snafu смотрел, че-то не поперло. По-моему, недостаточно навороченный контекст у него был...
источник

ID

Ivan Dubrov in Rust — русскоговорящее сообществo
Поэтому ручками через .map_err() делаем.
источник