Size: a a a

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

2020 March 22

ph

pl 🦑 hk in Rust — русскоговорящее сообществo
Что значит независимых?
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообществo
Михаил Лёсин
А как изобразить такой тип Result<..>, чтобы он мог возвращать не только одну ошибку но и несколько одновременно (независимых, как например во время валидации чего-нибудь), но при этом чтобы работали вопросики?
Result<T, Vec<MyError>> и impl From<MyError> for Vec<MyError> для того, чтобы работали вопросики
источник

МЛ

Михаил Лёсин in Rust — русскоговорящее сообществo
pl 🦑 hk
Что значит независимых?
Что вторая ошибка не является следствием первой, но это наверное к делу мало относится
источник

МЛ

Михаил Лёсин in Rust — русскоговорящее сообществo
Антон ⚙️
Result<T, Vec<MyError>> и impl From<MyError> for Vec<MyError> для того, чтобы работали вопросики
Я пробовал так, где MyError был Box<std::error::Error> но в какой-то момент мне было сказано размер типа на время компиляции не известен. Подозреваю что где-то у меня образовалось циклическая зависимость, возможно из-за impl From типом а-ля T+'static: std::error::Error. С наскоку победить не удалось вот и подумал вдруг я не первый которому такое надо и возможно есть крейты для подобного
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообществo
Михаил Лёсин
Я пробовал так, где MyError был Box<std::error::Error> но в какой-то момент мне было сказано размер типа на время компиляции не известен. Подозреваю что где-то у меня образовалось циклическая зависимость, возможно из-за impl From типом а-ля T+'static: std::error::Error. С наскоку победить не удалось вот и подумал вдруг я не первый которому такое надо и возможно есть крейты для подобного
Показывай, на каком коде тебе раст показал фигу
источник

МЛ

Михаил Лёсин in Rust — русскоговорящее сообществo
А обязательно свой тип определять? Я сейчас делаю pub type CError = Vec<Box<dyn std::error::Error>>; и оно ругается типа the trait 'std::convert::From<&str>' is not implemented for 'std::vec::Vec<std::boxed::Box<(dyn std::error::Error + 'static)>>', пытаюсь описать impl который оно не нашло - пишет что низзя, т.к. в другом крейте
источник

МЛ

Михаил Лёсин in Rust — русскоговорящее сообществo
вот на такой импл:
impl From<&str> for CError {
   fn from(error: &str) -> Self {
       unimplemented!()
   }
}
источник

МЛ

Михаил Лёсин in Rust — русскоговорящее сообществo
говорит
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
--> src/lib/error.rs:4:1
 |
4 | impl From<&str> for CError {
 | ^^^^^----------^^^^^------
 | |    |              |
 | |    |              `std::vec::Vec` is not defined in the current crate
 | |    `str` is not defined in the current crate
 | impl doesn't use only types from inside the current crate
 |
 = note: define and implement a trait or new type instead
источник

МЛ

Михаил Лёсин in Rust — русскоговорящее сообществo
Антон ⚙️
Показывай, на каком коде тебе раст показал фигу
тот код уже канул в лету, пишу заново - вот новые радости. про тот я вспомнил что определял енум где разделял ошибки на "одну" и "много". сейчас думаю что это бессмысленно наверное
источник

ᵛᵉⁿᵈᵉˡⁱᵉᵘ in Rust — русскоговорящее сообществo
Доброго времени суток, есть кто работает с актиксом, не подскажите не могу понять есть ли у у него роутинг посредством аннотаций?

а то я вижу то что надо сначала функцию с аннотацией указать как сервис чтоб он видел роут а это не очень найс :\
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
ᵛᵉⁿᵈᵉˡⁱᵉᵘ
Доброго времени суток, есть кто работает с актиксом, не подскажите не могу понять есть ли у у него роутинг посредством аннотаций?

а то я вижу то что надо сначала функцию с аннотацией указать как сервис чтоб он видел роут а это не очень найс :\
Я вообще отказался от аннотаций и роутинг строю с другой стороны
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Михаил Лёсин
говорит
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
--> src/lib/error.rs:4:1
 |
4 | impl From<&str> for CError {
 | ^^^^^----------^^^^^------
 | |    |              |
 | |    |              `std::vec::Vec` is not defined in the current crate
 | |    `str` is not defined in the current crate
 | impl doesn't use only types from inside the current crate
 |
 = note: define and implement a trait or new type instead
Newtype спасёт отца русской демократии. 😉
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Mike Lubinets
@sovasergey есть ли какие-то новости по actix-rest или другим инструментам для генерации сваггер-доки для actix-web?
сделал достаточную версию генератора кода для actix_swagger.
Генерирует такое: https://github.com/sergeysova/actix-swagger/blob/master/cargo-swagg/out.rs

Впринципе, этого достаточно, чтобы писать приложения, у меня примерно такое юзается. Но тут нет исполнения контракта обработчиков запросов. Нет обязания правильно обрабатывать request body в обработчике. Я не смог найти способ это сделать через actix_web::dev::Factory.

Вот issue обсуждения: https://github.com/actix/actix-web/pull/1339

По actix-swagger:
Сейчас буду писать конвертацию yaml структур, в формат генератора кода. Скорее всего там будет пачка HashMap/BTreeMap, чтобы корректно резолвить ссылки. Первая реализация будет очень тупая, и сможет работать только со ссылками в requestBody, responses, params и прочим. Также не будет поддержки импортов из файлов.

В чем нужна помощь:
- Поревьювить код. Там почти всё написано так, чтобы получить первую рабочую версию.
- Было бы круто накидать тесты на генератор кода(называется printer). Думаю банальных inline snapshots было бы достаточно. Дать на вход разные варианты конфигурации, и получить вменяемый код.
- Преобразовать свои личные openapi3 файлы спеки апи в структуры cargo-swagg и поглядеть достаточно ли того, что там есть или нужно что-то ещё. Если нужно ещё что-то, создать issue/pr с реализацией.
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Цели проекта:
Дать на вход спецификацию openapi3, на выходе получить генерированный код, который не нужно править руками. При этом его можно коммитить в репо и смотреть изменения в гите после ручной перегенерации. Можно вынести в отдельный крейт, перегенерировать в ci и деплоить крейт новой версии. Обновлять в проекте, когда будет удобно.

Как использовать:
- Подключается как сервис в main
- В модуле роута импортируются типы request body и response
- actix_swagger::Response используется как аналог actix_web::Response с явными типами ответа, чтобы проверять, что обработчик запроса реализует контракт.
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Надо разобраться:

как заставить обработчик запросов исполнять контракт на request body, query и headers.

Я думал сделать свой аналог actix_web::dev::Factory, так называемый BoundFactory. Которому бы прописал реализации для Fn. BoundFactory это трейт, который обязывает функцию иметь несколько обязательных параметров конкретных типов.

Так можно было бы хендлеры иметь первые аргументы четких типов, вроде request_body: request_bodies::Example, query: session_create::Query, а остальные аргументы были бы производных типов, так можно было бы вытаскивать нужные штуки, вроде actix_web::web::Data<MyApp>

Но я уперся в приватность Handler — https://github.com/actix/actix-web/pull/1339

А как реализовать BoundFactory или вообще достигнуть цели через Handle trait я не понял (https://github.com/actix/actix-web/pull/1275)

Буду безмерно благодарен, за любую помощь
источник

DZ

Dmitry Zherebko in Rust — русскоговорящее сообществo
🦉 ⁣
Надо разобраться:

как заставить обработчик запросов исполнять контракт на request body, query и headers.

Я думал сделать свой аналог actix_web::dev::Factory, так называемый BoundFactory. Которому бы прописал реализации для Fn. BoundFactory это трейт, который обязывает функцию иметь несколько обязательных параметров конкретных типов.

Так можно было бы хендлеры иметь первые аргументы четких типов, вроде request_body: request_bodies::Example, query: session_create::Query, а остальные аргументы были бы производных типов, так можно было бы вытаскивать нужные штуки, вроде actix_web::web::Data<MyApp>

Но я уперся в приватность Handler — https://github.com/actix/actix-web/pull/1339

А как реализовать BoundFactory или вообще достигнуть цели через Handle trait я не понял (https://github.com/actix/actix-web/pull/1275)

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

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Dmitry Zherebko
Можно через филд декораторы описывать откуда хочешь взять тот или иной параметр, куки, хедер, урл.
это мысль.
Но опять же, тут более высокоуровневая проблема. Как заставить хендлер иметь первый аргумент с конкретной структурой.

https://github.com/sergeysova/actix-swagger/blob/master/cargo-swagg/out.rs#L51
источник

DZ

Dmitry Zherebko in Rust — русскоговорящее сообществo
🦉 ⁣
это мысль.
Но опять же, тут более высокоуровневая проблема. Как заставить хендлер иметь первый аргумент с конкретной структурой.

https://github.com/sergeysova/actix-swagger/blob/master/cargo-swagg/out.rs#L51
Ну тут по разному в некоторых генераторах вообще забивают на это и просто генерят методы что бы получить параметры с контекста
источник

DZ

Dmitry Zherebko in Rust — русскоговорящее сообществo
getUserParamsFromContext(ctx)
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
drjackild
даже не знаю, насколько правильный такой подход, но это работает)
Не очень понятно, чего ты хочешь добиться. Если в стриме несколько запросов, и ты хочешь считать первый, то тебе нужно аккуратно парсить протокол.
Например в случае http надо посмотреть в заголовок, где может быть записан размер тела.
Если протокол текстовый (хотя бы частично), то можешь обернуть стрим в BufReader, у него есть полезные методы типа read_line.
источник