#rust #rust-macros #rust-proc-macros
#Ржавчина #rust-макросы #rust-proc-macros
Вопрос:
Я пытаюсь написать атрибутивный макрос для proc-макроса, который позволил бы мне удалить поле из структуры или полностью заменить его подпись.
Что-то похожее на это:
#[derive(my_macro)]
struct OurStruct{
a: i32,
#[my_macro(remove)]
field_to_remove: i32
}
Что должно привести к:
struct OurStruct{
a: i32,
}
Я знаю, как писать макросы для добавления в impl-часть структуры, но пока у меня проблема с поиском какого-либо примера того, как изменить часть кода, отмеченную атрибутом-макросом.
Возможно ли это? Если да, не могли бы вы предоставить образец?
Комментарии:
1. вы в основном просите объяснить, как выполнить макрос proc, который слишком широк
2. Нет, я не спрашиваю, как выполнить макрос proc. Я уже написал остальную часть кода, используя darling. Это только последняя часть кода, и она конкретно касается макросов атрибутов и того, имеют ли они доступ к диапазону кода, который они отмечают. Я знаю, как перебирать каждое поле или его атрибуты. Я знаю, как написать что-то похожее на dervie (по умолчанию). Это очень специфический случай. Что, я думаю, невозможно с текущим rust.
3. AFAIK, у вас есть доступ к дереву токенов в макросе proc, поэтому у вас есть доступ ко всему, вы спрашиваете «как найти это в дереве токенов», что в итоге означает «как выполнить макрос proc», если у вас уже есть рабочий код, вы, вероятно, знаете больше о том, как создать процессмакрос, чем я на практике, я хочу сказать, что ваш вопрос выглядит очень широким. Я рекомендую вам поискать, как это сделать serde.rs/field-attrs.html#skip , у serde есть много атрибутов в поле, поэтому вы должны найти много примеров того, как сделать то, что вы просите.
4. Вам нужно использовать макрос attribute proc. Он принимает все токены структуры и вместо этого возвращает новые токены для размещения.
5. Я уже реализовал нечто подобное для skip. Пропустить — нет; удалите поле из структуры, оно не реализует сериализатор. код десериализатора. Что мне нужно, так это полностью удалить поле, добавив некоторый код в тело раздела impl.