WIP: custom #ingest#protocol parser #23

Draft
DarkCat09 wants to merge 5 commits from custom-parser into master
Owner

Closes #22

Closes #22
DarkCat09 added 4 commits 2025-01-10 21:37:48 +03:00
DarkCat09 added a new dependency 2025-01-10 21:38:09 +03:00
requested review from nm17 2025-01-10 21:38:20 +03:00
Author
Owner

Это плохой код, не делайте так

Это плохой код, не делайте так
Author
Owner

Бтв парсинг мак-адреса сделан без библиотеки hex (см. последний коммит, успешно прое-ался с битовым сдвигом, подумал про BIN вместо HEX)

Бтв парсинг мак-адреса сделан без библиотеки hex (см. последний коммит, успешно прое-ался с битовым сдвигом, подумал про BIN вместо HEX)
Author
Owner

Во многих местах .context() выглядит громоздко. @nm17, можно как в thiserror просто конвертить в енум ошибки? В доках не нашёл

Во многих местах `.context()` выглядит громоздко. @nm17, можно как в thiserror просто конвертить в енум ошибки? В доках не нашёл
Owner

@DarkCat09 wrote in #23 (comment):

Во многих местах .context() выглядит громоздко. @nm17, можно как в thiserror просто конвертить в енум ошибки? В доках не нашёл

Весь прикол в том, что допустим у тебя есть enum вариант с source: T1. Самого факта того, что у тебя что-то возвращает Result<..., T1> - мало, ибо у тебя в snafu может быть несколько вариантов с source: T1. Соответственно - .context() повзоляет указать какой из них тебя интересует. Конечно, когда у тебя только один вариант с source: T1 - то логично было бы автоматом impl From<T1> for ErrorEnum делать, но такого функционала у snafu нет, насколько я знаю. Мб оно и к лучшему, хз.

@DarkCat09 wrote in https://git.dc09.ru/iotishnik/server/pulls/23#issuecomment-372: > Во многих местах `.context()` выглядит громоздко. @nm17, можно как в thiserror просто конвертить в енум ошибки? В доках не нашёл Весь прикол в том, что допустим у тебя есть enum вариант с `source: T1`. Самого факта того, что у тебя что-то возвращает `Result<..., T1>` - мало, ибо у тебя в snafu может быть несколько вариантов с `source: T1`. Соответственно - `.context()` повзоляет указать какой из них тебя интересует. Конечно, когда у тебя только один вариант с `source: T1` - то логично было бы автоматом `impl From<T1> for ErrorEnum` делать, но такого функционала у snafu нет, насколько я знаю. Мб оно и к лучшему, хз.
nm17 requested changes 2025-01-11 13:14:12 +03:00
nm17 left a comment
Owner

Некоторое требует поправок и обсуждения

Некоторое требует поправок и обсуждения
@ -20,2 +11,3 @@
use crate::ingest_protocol::{NMDeviceDataPacket, SensorValue};
let mut counter = 0;
pub fn parse_packet(mut input: &[u8]) -> Result<NMDeviceDataPacket, Error> {
Owner

Может быть всё-таки будем использовать Bytes для этого всего? Таким образом в Error сможем добавлять на каком именно куске всё пошло не по плану)

Может быть всё-таки будем использовать Bytes для этого всего? Таким образом в Error сможем добавлять на каком именно куске всё пошло не по плану)
Author
Owner

// из обсуждения в телеграме: я предлагал вариант с чтением напрямую из impl AsyncReadExt, но Даня верно заметил, что парсер не совсем этим должен заниматься => делаем с bytes::Bytes

// из обсуждения в телеграме: я предлагал вариант с чтением напрямую из impl AsyncReadExt, но Даня верно заметил, что парсер не совсем этим должен заниматься => делаем с `bytes::Bytes`
@ -136,0 +142,4 @@
Ok(packet)
}
pub fn parse_mac_address(input: &[u8]) -> Result<[u8; 6], Error> {
Owner

Точно ли хорошая идея избавиться от nom-like нотации поглощения и возвращения результата и остатков? Она как минимум нужна будет если захотим сделать парсинг нескольких пакетов в одном TCP подключении ( #11 ).

Точно ли хорошая идея избавиться от nom-like нотации поглощения и возвращения результата и остатков? Она как минимум нужна будет если захотим сделать парсинг нескольких пакетов в одном TCP подключении ( #11 ).
Author
Owner

Как это будет в коде тцп-сервера? По-моему ты там всё равно будешь читать из потока до ## и передавать вот эти байты в парсер, у него не будет остатков

Как это будет в коде тцп-сервера? По-моему ты там всё равно будешь читать из потока до `##` и передавать вот эти байты в парсер, у него не будет остатков
@ -29,3 +30,2 @@
assert_eq!(
parse_mac_address("12-34-AA-12-55-AA").unwrap(),
("", [18, 52, 170, 18, 85, 170])
parse_mac_address(b"12-34-Aa-1255-fA").unwrap(),
Owner

Хм, вижу решил сделать парсинг мака более универсальным, да?

Хм, вижу решил сделать парсинг мака более универсальным, да?
Author
Owner

Ага. Ну и лишние проверки при текущей логике парсера мака будут выглядеть некрасиво

Ага. Ну и лишние проверки при текущей логике парсера мака будут выглядеть некрасиво
DarkCat09 marked this conversation as resolved
@ -47,0 +40,4 @@
impl From<Error> for QSParserError {
fn from(value: Error) -> Self {
QSParserError::Parsing {
context: format!("{:?}", value),
Owner

Так, это вообще не пойдёт. Это было сделано как колхоз для того, чтобы не притягивать лайфтаймы в QSParserError, но теперь, так как у нас Error 'static, можно и нужно Error парсера перекидывать как source.

Так, это вообще не пойдёт. Это было сделано как колхоз для того, чтобы не притягивать лайфтаймы в QSParserError, но теперь, так как у нас Error 'static, можно и нужно Error парсера перекидывать как source.
Author
Owner

А, я это вообще не заметил, исправил только чтоб компилялось

А, я это вообще не заметил, исправил только чтоб компилялось
DarkCat09 added 1 commit 2025-01-17 19:36:09 +03:00
This pull request is marked as a work in progress.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin custom-parser:custom-parser
git checkout custom-parser
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference: iotishnik/server#23
No description provided.