Денис
под "сериализовывать" я имею в виду serde-стайл штуки разумеется)
Денис
в принципе можно всё индексировать на этапе сериализации и подменять поля соответствующие на эти индексы
Денис
но мб есть какое-то стандартное решение?
Маjко
Писать кастомный Serializer
Денис
ну я скорее про общий принцип
Денис
а не про детали реализации
Денис
вообще нет, но думаю задача эквивалентная я парсю плюсовый код, и, например, в классах поля ссылаются на другие типы, которые тоже парсятся
Денис
кстати, а как правильно говорить — парсю или паршу?)
Денис
в принципе, каждый тип однозначно определяется полным именем (включая неймспейсы), так что можно на этом остановиться и записывать эту штуку в качестве идентификатора
Денис
но может есть какой-то более труЪ-вей
Anton
Мне кажется серде тут не совсем подходит, у тебя AST
Anton
Типы тут скорее некий глобальный хэшмап
Anton
Если я правильно понял что ты хочешь
Денис
ну короче, вот есть у меня распарсенные типы, которые всячески друг на друга ссылаются, грубо говоря struct Type { kind: TypeKind, ... } enum TypeKind { ... Alias { origin: Rc<Type> }, ... }
Денис
и я хочу это дело сериализовать
Денис
сиречь, записать в какой-нибудь джейсончик или типа того, не суть важно
Денис
чтобы эти данные потом можно было использовать из других мест
Денис
разумеется я могу (и делаю) хэш-мапу, где все типы хранятся, у которой ключ — полное имя типа
Денис
и я могу сделать кастомную сериализацию для всех полей, где встречается Rc<Type>, чтобы записывалось просто полное имя типа
Денис
но, например, загрузка этих данных обратно будет крайне болезненной, потому что придётся пилить кастомный десериализатор, что, как известно, суть боль
Денис
и я подумал: может есть какое-то стандартное решение, чтобы мне ничего не пришлось ручками писать :)
Anton
разумеется я могу (и делаю) хэш-мапу, где все типы хранятся, у которой ключ — полное имя типа
Так у тебя только имена типов хранятся или полный набор полей?
Денис
мапа — это "имя" -> "полное описание типа"
Anton
Не встречал готовых решений, несколько раз писал десерилзаторы для простых типов, вроде никакой боли не встречал)
Anton
Да
Anton
Там в самих тикетах автор частотдает крутые снипеты
Денис
я ни разу не писал десериализатор для серде, но смотрел на них и плакал :(
Денис
я вижу у себя такую потенциальную проблему при десериализации: вот я десериализую тип, и там встречается поле, которое ссылается на тип, который ещё не десериализован
Денис
и что мне делать? =)
Anton
это ты крут
На самом деле нет, это как с бороу чекером, надо понять суть
Sergey
Потом печать
Anton
я вижу у себя такую потенциальную проблему при десериализации: вот я десериализую тип, и там встречается поле, которое ссылается на тип, который ещё не десериализован
Так у тебя там не тип а описание его, когда ты делаешь десерилищациб ты указываешь в какой тип положить, в типе соответственно аннотации
Денис
Десериализовать сначала типы в память Потом поля
ну то есть серилизовать в промежуточный тип, а-ля HashMap<Name, Option<Rc<Type>>>, а потом разворачивать его в HashMap<Name, Rc<Type>>
Anton
let data: Types = from()
Alex
CStr и CString нужны только для интеропа с С
Не совсем. Не помню точно как, но Path только в CString может. Возможно путаю с ещё одной строкой (я вообще про нативную системную).
Anton
У тебя все пытается применится к Types
Anton
Который по сути будет типа рекурсивный
Anton
Абстргируйся ща
Dårk
переписал добрую часть сетевого протокола MotionSource for Cemuhook на Rust. теперь пытаюсь понять, зачем я это сделал, и какой фронтэнд к нему прикрутить.
Anton
Допустим у тебя структура struct X {name, field: X}
Anton
Rc<>
Anton
Так вот десерилищатор спускается сверху, и раскладывает все по полям
Anton
Добавляя вложенные элементы
Денис
в смысле добавляя?
Денис
я не могу создать тип с пустым полем =)
Anton
Ну например у тебя fields: Vec<X>
Anton
Он будет заполнять вектор элементами
Dårk
переписал добрую часть сетевого протокола MotionSource for Cemuhook на Rust. теперь пытаюсь понять, зачем я это сделал, и какой фронтэнд к нему прикрутить.
суть: использовать любое устройство для эмуляции гироскопа (каноничная реализация: DualShock 4). Через такой драйвер всякие мобилки и кофеварки можно использовать с эмулятором WiiU (Cemu) чтобы, например, перетягивать игровые предметы движениями в воздухе.
Anton
я не могу создать тип с пустым полем =)
Еще раз десерелизатор не создает новый тип, он распаковывает в тот который ты ему задаш
Денис
ээ
Денис
минутку
Dårk
теперь либо действительно компилить под мобилки, проксируя показания нативного гироскопа, либо так поиграться на ноуте с мышкой
Денис
вот примерно как всё это дело дефайнится
Денис
ну короче, вот есть у меня распарсенные типы, которые всячески друг на друга ссылаются, грубо говоря struct Type { kind: TypeKind, ... } enum TypeKind { ... Alias { origin: Rc<Type> }, ... }
Денис
и лежит это всё в HashMap<Name, Rc<Type>>
Dårk
для интереса
книга дракона
Anton
Абстрактно, let type: HashMap<String, Rc<Type>> = deserialize_from(data)
Денис
так
Денис
при этом внутри Type тоже есть Rc<Type>>
Anton
Десеризатор заполняет хешмап
Anton
То есть на верхнем уровне создает хешмап, потом начинает создавать элементы для него
Денис
так
Dårk
теперь либо действительно компилить под мобилки, проксируя показания нативного гироскопа, либо так поиграться на ноуте с мышкой
призываю тапок @tapok_satan пояснить за последние веяния моды в области фронтендов на расте. ну или хотя бы биндингов каких...
Anton
Десерелизирует ключ, поскольку значение комбинировано он создает Type и начинает заполняеть его поля
Денис
его можно создать, только когда все поля известны
Anton
Условно)
Anton
Если не условно
Anton
Он получает все поля type
Anton
И ищет в исходном потоке соответствие ключей
Anton
Учитывая serde rename
Денис
Он получает все поля type
ну и вот тут и возникает проблема
Anton
ну и вот тут и возникает проблема
Не возникает, он получает вначале только названия полей
Денис
ещё как возникает
Денис
потому что одно из полей type'а в сериализованном виде — это просто имя типа