Size: a a a

F# Flood: Смак с Андреем Макаревичем

2020 March 19

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
у нас в проекте пытаются парсить жсоны следуя советам одного широкоизвестного поехавшего
источник

SB

S B in F# Flood: Смак с Андреем Макаревичем
Shub Niggurath
у нас в проекте пытаются парсить жсоны следуя советам одного широкоизвестного поехавшего
огласите имя героя, пожалуйста. народ должен знать своих пророков в лицо!
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
код получается приблизительно такой (вариаций на самом деле масса, но идея та же): берется DU, для каждого кейса в этом DU определяется тип тела, для вязкости добавляются кастомные парсеры для каждого кейса, все это сваливается в один СПИСОК
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
вот псевдокод
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
как вы понимаете, реальные типы куда более развесистые, поэтому количество кода растет экспоненциально. и даже в этом псевдокоде я умудрился сделать пару багов
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
я в курсе за UnionContract из TypeShape, но во-первых, он решает только небольшую часть проблемы, а во-вторых, количество кода приблизительно эквивалентное
источник

SB

S B in F# Flood: Смак с Андреем Макаревичем
выглядит очень Parsec-like, если честно
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
гораздо более существенный вопрос - эргономика этого представления
источник

оГ

отец Григорий in F# Flood: Смак с Андреем Макаревичем
сижу и думаю - как же хорошо, что мне надо парсить только CSV!
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
по сути, в таком подходе у нас нет возможности работать с обобщенным типом MyEvent (надо вручную мейнтейнить этот дикий match на десяток кейсов) и нет никаких гарантий на структуру самого сообщения
источник

оГ

отец Григорий in F# Flood: Смак с Андреем Макаревичем
Shub Niggurath
я в курсе за UnionContract из TypeShape, но во-первых, он решает только небольшую часть проблемы, а во-вторых, количество кода приблизительно эквивалентное
а его не можно как-то автогенерить?
источник

оГ

отец Григорий in F# Flood: Смак с Андреем Макаревичем
из пбуфа там какого-нить
источник

оГ

отец Григорий in F# Flood: Смак с Андреем Макаревичем
нахера этот код писать?
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
в смысле, если мой жсон имеет вид типа {id:..., type: ..., payload: {...}} - я должен полагаться только на добрую волю других разрабочиков в надежде, что в всех структурах будет определен скажем payload
источник

VS

Vasily Shapenko in F# Flood: Смак с Андреем Макаревичем
Shub Niggurath
по сути, в таком подходе у нас нет возможности работать с обобщенным типом MyEvent (надо вручную мейнтейнить этот дикий match на десяток кейсов) и нет никаких гарантий на структуру самого сообщения
Ну я писал в bson еще и информацию о DU и прочем
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
и чтобы этот payload оттуда извлечь - снова бешеный match
источник

VS

Vasily Shapenko in F# Flood: Смак с Андреем Макаревичем
источник

SN

Shub Niggurath in F# Flood: Смак с Андреем Макаревичем
я собираюсь представить это все одним классом - IMessage<a'>(id: string, type: string, payload: 'a)
убедите меня в обратном
источник

оГ

отец Григорий in F# Flood: Смак с Андреем Макаревичем
Shub Niggurath
я собираюсь представить это все одним классом - IMessage<a'>(id: string, type: string, payload: 'a)
убедите меня в обратном
не по дддшному - возможны невозможные представления
источник