Нормальный вывод ошибок с proc macro attribute [Rust]

Я делал свои собственные макросы-атрибуты, и заметил проблему.

При добавлении макроса

#[GET("/")]
fn index() {
    load!("../static/index.html")
}

С появлением ошибки, она скрывается за макросом, без точного вывода строки и места с ошибкой

error[E0308]: mismatched types
 --> src\main.rs:3:1
  |
3 | #[GET("/")]
  | ^^^^^^^^^^^
  | |
  | expected `u8`, found `&str`
  | expected due to this
  |
  = note: this error originates in the attribute macro `GET` (in Nightly builds, run with -Z macro-backtrace for more info)

Какими средствами можно это исправить?


Ответы (1 шт):

Автор решения: Rooter

Я понял что не так.

В реализации макроса, я несколько раз конвертировал ввод между типами String/TokenStream. От этого вывод считался компилятором ошибкой в РЕАЛИЗАЦИИ макроса, а не в его вводе.

Во избежание этого, нужные части Block храните в исходном виде. А нужные реализации можно модифицировать через парсинг в структуры с syn. Но при этом даже после парсинга в структуру из syn, и последующим конвертацией через quote!, трейсинг ошибок остается, и ошибки в блок-кодах выводиться правильно.

Поэтому стоит частично отказаться от злоупотреблением Regex, в пользу ручной конфигурации.

→ Ссылка