Макрос Rust: ожидаемый буквальный

Я немного изучаю макросы и пытаюсь использовать их, чтобы легко экспортировать свои данные в нужный каталог. Export_to ожидает строковый литерал, и я думал, что это то же самое, что делает concat, но, видимо, это не так ясно. Это ограничение макросов? Или есть какое-то решение этой проблемы?

Макрорасширение, похоже, работает нормально, поэтому я не знаю, что происходит.

Любые советы или идеи будут очень признательны!

#[macro_export]
macro_rules! create_endpoint {
    ($route:expr, $method:expr, $in_t:ty, $out_t:ty ) => {
        #[derive(Clone, Debug, Serialize, Deserialize, TS)]
        #[ts(export, export_to = concat!("../src/lib/endpoint_defines/", $route, "/", $method, ".ts"))]
        struct __Endpoint {
          in_type: $in_t,
          out_data_type: $out_t
        }
        
        #[cfg(test)]
        #[test]
        fn __export_write_endpoint() {
          write_endpoint($method, $route);
        }
    };
}
error: expected literal
  --> src/handshake/endpoint.rs:13:34
   |
13 |         #[ts(export, export_to = concat!("../src/lib/endpoint_defines/", $route, "/", $method, ".ts"))]
   |                                  ^^^^^^
   |
  ::: src/routes/mod.rs:18:1
   |
18 | create_endpoint!("", "POST", (), ());
   | ------------------------------------ in this macro invocation
   |
   = note: this error originates in the macro `create_endpoint` (in Nightly builds, run with -Z macro-backtrace for more info)

Да, это обычная проблема с макросами. Это должен быть буквально строковый литерал, а не просто что-то, что оценивается как строковый литерал. Очень надоедливый.

BallpointBen 17.02.2024 03:33

Ой, так нет обходного пути?

Eatenpancreas 17.02.2024 08:18

Используйте $route:literal и $method:literal в аргументах макроса: veykril.github.io/tlborm/decl-macros/minutiae/…

Jmb 17.02.2024 10:18

К сожалению, это тоже не работает

Eatenpancreas 18.02.2024 14:16
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
4
235
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы не контролируете макрос TS и не можете его изменить, это действительно проблема. Если макрос ожидает литерал, то что-то, расширяющееся до литерала (например, concat!(), не будет работать.

Декларативные макросы (macro_rules!) не могут решить эту проблему самостоятельно. Если вы хотите придерживаться их, вам придется передать макросу всю строку, что досадно.

Однако процедурные макросы могут быть полезны, поскольку они способны объединять литералы сами по себе, таким образом передавая готовый литерал в TS. Для этого можно было бы использовать существующий ящик, но я его не нашел.

Спасибо, тогда попробую разобраться!

Eatenpancreas 18.02.2024 14:18

Обновление: это сработало, я только что сделал это сам! Большое спасибо!

Eatenpancreas 18.02.2024 19:25

Другие вопросы по теме