Пишу сейчас код, который собирается в wasm, насобирал чутка лайфхаков.
Можно сделать пакет, который использую и из wasm-пакетов и там где всё это дело выполняю (в том числе с такими GAT в местах где типы расходятся), в котором завести трейты на все функции, которые могут экспортироваться из wasm'а. А затем реализовывать их для пустых структур, так сигнатуры функций не разойдутся.
В пакете общих утилит сделал тип Annotated, у которого #[repr(transparent)] (т.е. по сути это алиас для типа и в итоговой сборке ничего от него не останется). Им размечаю указатели, чтобы было понятнее, что за ними должно лежать.
Например, на скриншоте обозначил что кишки из которых можно собрать Vec должны будут держать строку внутри этого вектора. Чуть более сложными аннотациями размечаю ещё те байты, которые были сериализированы и привязываю туда тип сериализатора.
А затем можно сделать impl на таким образом аннотированный указатель, который возьмёт и всё распарсит, красота.
Не относится к wasm, но стал стараться во все функции, которые могут аллоцировать вектора байт, передавать Option, из которого функция может попробовать взять существующий вектор. И стараюсь никогда не выбрасывать использованные, а вернуть в какой-нибудь пул, чтобы затем передать его снова. Пока не знаю, насколько оно окупится и будут ли проблемы с тем, что в каких-то местах оно их сильно большими сделает (я стараюсь держать отдельные пулы для разных кейсов, чтобы не сделало все вектора гигантскими, а потом использовало их для хранения пары элементов), но это не сильно сложно делать и мне нравится.
Можно сделать пакет, который использую и из wasm-пакетов и там где всё это дело выполняю (в том числе с такими GAT в местах где типы расходятся), в котором завести трейты на все функции, которые могут экспортироваться из wasm'а. А затем реализовывать их для пустых структур, так сигнатуры функций не разойдутся.
В пакете общих утилит сделал тип Annotated, у которого #[repr(transparent)] (т.е. по сути это алиас для типа и в итоговой сборке ничего от него не останется). Им размечаю указатели, чтобы было понятнее, что за ними должно лежать.
Например, на скриншоте обозначил что кишки из которых можно собрать Vec должны будут держать строку внутри этого вектора. Чуть более сложными аннотациями размечаю ещё те байты, которые были сериализированы и привязываю туда тип сериализатора.
А затем можно сделать impl на таким образом аннотированный указатель, который возьмёт и всё распарсит, красота.
Не относится к wasm, но стал стараться во все функции, которые могут аллоцировать вектора байт, передавать Option, из которого функция может попробовать взять существующий вектор. И стараюсь никогда не выбрасывать использованные, а вернуть в какой-нибудь пул, чтобы затем передать его снова. Пока не знаю, насколько оно окупится и будут ли проблемы с тем, что в каких-то местах оно их сильно большими сделает (я стараюсь держать отдельные пулы для разных кейсов, чтобы не сделало все вектора гигантскими, а потом использовало их для хранения пары элементов), но это не сильно сложно делать и мне нравится.