doc
Только либы
Денис
короче конрод у меня на линуксе просто не работал. примеры запускались, но был абсолютный рассинхрон элементов + ресайз окна просто ломал всё
Alexander
Да хаскель и то что-то имеет в запасе.
Денис
хм
Денис
в июле того года
Alexander
Понял. Грустно.
Денис
да, я тогда искал на чём простенький интерфейс накидать. в итоге сделал гуй на рокете))))
Tuntz
коллеги, работал кто с nom?
Денис
тут таких много, так что просто спрашивай)
Tuntz
как протестировать тэг впереди и на основании этого выбрать парсер?
Tuntz
do_parse!( ... packet: alt!( tag!("getchallenge") => { |_| Packet::ChallengeRequest } | tag!("connectResponse") => { |_| Packet::ConnectResponse } | tag!("challengeResponse") => { do_parse!( id: read_cstring >> (Packet::ChallengeResponse { id }) ) } ) » ...
Tuntz
так посылает на 3 буквы, пишет unexpected end of macro invocation
Alexander
@tapok_satan недельный апдейт по gui озвучь , plz
Cat
@tapok_satan недельный апдейт по gui озвучь , plz
у него там сейчас больше бюрократические обновления
Loyd
так посылает на 3 буквы, пишет unexpected end of macro invocation
do_parse не засунуть, насколько я понимаю, в то место, куда ты хочешь
Alexander
Канбан? Это же типа электрона? Зачем он.
Loyd
Можно сделать alt!( do_parse!( tag!("getchallenge" >> (Packet::ChallengeRequest) ) | ... | do_parse!( tag!("challengeResponse") >> id: read_csctring >> (Packet::ChallengeResponse { id }) ) )
Berkus
Через relm?
http://gtk-rs.org/docs/gtk/
Alexander
Ну а relm вообще смотреть не стоит?
Денис
парсер — в смысле функцию, которая с номовская сигнатурой
Денис
ну почему, с ним
Loyd
Я где-то так выкрутился, когда такая же проблема была
Tuntz
а если надо будет внятную ошибку выдавать?
Tuntz
после проверки тега, но в нужном парсере
Loyd
В случае, если тега нет?
Tuntz
не
Tuntz
если тег есть
Tuntz
но данные, которые дальше, невалидные
Tuntz
так он просто не сможет до конца применить парсер, и ошибка будет одинаковая
Tuntz
что тег левый, что payload
Loyd
Ну, ты о том, что alt будет дальше перебирать и поэтому ошибка одна всегда будет
Tuntz
ага
Денис
есть ещё свитч — https://docs.rs/nom/4.0/nom/macro.switch.html
Loyd
А вместо {} нельзя в alt? Ну, сразу tag!(...) => do_parse
Денис
но его наверное сложно тут будет применить
Loyd
Да нет, одинаково
Loyd
switch семантичнее, конечно
Loyd
Зря они в alt сделали форму с =>
Loyd
Потому что с switch пересекается функциональность теперь
Tuntz
не-не-не, свитч про другое
Tuntz
к нему tag не прицепить
Loyd
А зачем он ему? Там делаешь take_while и потом свитч
Loyd
Чем тебе не тег
Loyd
А вот если надо tag_no_case, то да, сложнее
Tuntz
а если нет разделителя после тега?
Tuntz
здесь как раз нужна семантика "примени первый парсер, и если успешно, то примени второй парсер и верни его результат"
Tuntz
хм, есть идея
Tuntz
сделать отдельный енум PacketType
Tuntz
сначала альтом распарсить тег в PacketType, а потом свичом выбрать парсер на основе PacketType
Max
[Перевод] Как обновление Rust 1.26 ускорило мой код в три с лишним раза https://u.tmtm.ru/KE9UA
Loyd
Я тут смотря как грамматики описывают на этом nom. Скажем, в парсере glsl подход с alt + вложенными do_parse.
Tuntz
Я тут смотря как грамматики описывают на этом nom. Скажем, в парсере glsl подход с alt + вложенными do_parse.
подход интересный, но это быстрокод потому что съедает реальную ошибку
Loyd
Ага (
Loyd
А alt!( ... | tag!("a" => do_parse!) не работает?
Loyd
Короче, надо посмотреть реализацию alt
Loyd
Там ещё и тестов на эту альтернативную форму —> 0
Tuntz
А alt!( ... | tag!("a" => do_parse!) не работает?
ээээ ты предлагаешь прицепить второй парсер к аргументу для tag-a?
Loyd
Там скобочка потерялась
Loyd
Ну, сейчас косяк в том, что альтернативная форма после => ожидает expr
Loyd
Поэтому там {do_parse!(...)} и не работает
Loyd
Не, не работает
Tuntz
загнал do_parse! в ф-ю, но она возвращает IResult, в отличие от остальных
Loyd
Все макросы-комбинаторы iresult же возвращают
Loyd
А чем тебе switch сейчас не подходит?
Tuntz
можно заставить все остальные замыкания возвращать IResult::Ok
Loyd
switch!(take_while!(is_alphabetic), "somekek" => do_parse!(...) | .... )
Tuntz
switch!(take_while!(is_alphabetic), "somekek" => do_parse!(...) | .... )
сразу после тега могут идти рандомные байты