Денис
под "сериализовывать" я имею в виду serde-стайл штуки разумеется)
Денис
в принципе можно всё индексировать на этапе сериализации и подменять поля соответствующие на эти индексы
Денис
но мб есть какое-то стандартное решение?
Маjко
Писать кастомный Serializer
Денис
ну я скорее про общий принцип
Денис
а не про детали реализации
Антон
Денис
вообще нет, но думаю задача эквивалентная
я парсю плюсовый код, и, например, в классах поля ссылаются на другие типы, которые тоже парсятся
Денис
кстати, а как правильно говорить — парсю или паршу?)
Денис
в принципе, каждый тип однозначно определяется полным именем (включая неймспейсы), так что можно на этом остановиться и записывать эту штуку в качестве идентификатора
Денис
но может есть какой-то более труЪ-вей
Anton
Мне кажется серде тут не совсем подходит, у тебя AST
Anton
Типы тут скорее некий глобальный хэшмап
Anton
Если я правильно понял что ты хочешь
Денис
ну короче, вот есть у меня распарсенные типы, которые всячески друг на друга ссылаются, грубо говоря
struct Type {
kind: TypeKind,
...
}
enum TypeKind {
...
Alias { origin: Rc<Type> },
...
}
Денис
и я хочу это дело сериализовать
Денис
сиречь, записать в какой-нибудь джейсончик или типа того, не суть важно
Денис
чтобы эти данные потом можно было использовать из других мест
Денис
разумеется я могу (и делаю) хэш-мапу, где все типы хранятся, у которой ключ — полное имя типа
Денис
и я могу сделать кастомную сериализацию для всех полей, где встречается Rc<Type>, чтобы записывалось просто полное имя типа
Денис
но, например, загрузка этих данных обратно будет крайне болезненной, потому что придётся пилить кастомный десериализатор, что, как известно, суть боль
Денис
и я подумал: может есть какое-то стандартное решение, чтобы мне ничего не пришлось ручками писать :)
Anton
Денис
мапа — это "имя" -> "полное описание типа"
Anton
Не встречал готовых решений, несколько раз писал десерилзаторы для простых типов, вроде никакой боли не встречал)
Sergey
Anton
Да
Anton
Там в самих тикетах автор частотдает крутые снипеты
Денис
Денис
я ни разу не писал десериализатор для серде, но смотрел на них и плакал :(
Денис
я вижу у себя такую потенциальную проблему при десериализации: вот я десериализую тип, и там встречается поле, которое ссылается на тип, который ещё не десериализован
Денис
и что мне делать? =)
Anton
это ты крут
На самом деле нет, это как с бороу чекером, надо понять суть
Sergey
Sergey
Потом печать
Anton
Anton
let data: Types = from()
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
Он будет заполнять вектор элементами
Cat
Денис
ээ
Денис
минутку
Dårk
теперь либо действительно компилить под мобилки, проксируя показания нативного гироскопа, либо так поиграться на ноуте с мышкой
Денис
вот примерно как всё это дело дефайнится
Денис
ну короче, вот есть у меня распарсенные типы, которые всячески друг на друга ссылаются, грубо говоря
struct Type {
kind: TypeKind,
...
}
enum TypeKind {
...
Alias { origin: Rc<Type> },
...
}
Денис
и лежит это всё в HashMap<Name, Rc<Type>>
Anton
Абстрактно,
let type: HashMap<String, Rc<Type>> = deserialize_from(data)
Денис
так
Денис
при этом внутри Type тоже есть Rc<Type>>
Anton
Десеризатор заполняет хешмап
Anton
То есть на верхнем уровне создает хешмап, потом начинает создавать элементы для него
Денис
так
Anton
Десерелизирует ключ, поскольку значение комбинировано он создает Type и начинает заполняеть его поля
Денис
Денис
его можно создать, только когда все поля известны
Anton
Условно)
Anton
Если не условно
Anton
Он получает все поля type
Anton
И ищет в исходном потоке соответствие ключей
Anton
Учитывая serde rename
Денис
ещё как возникает
Денис
потому что одно из полей type'а в сериализованном виде — это просто имя типа