Я немного изучаю макросы и пытаюсь использовать их, чтобы легко экспортировать свои данные в нужный каталог. 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)
Ой, так нет обходного пути?
Используйте $route:literal
и $method:literal
в аргументах макроса: veykril.github.io/tlborm/decl-macros/minutiae/…
К сожалению, это тоже не работает
Если вы не контролируете макрос TS
и не можете его изменить, это действительно проблема. Если макрос ожидает литерал, то что-то, расширяющееся до литерала (например, concat!()
, не будет работать.
Декларативные макросы (macro_rules!
) не могут решить эту проблему самостоятельно. Если вы хотите придерживаться их, вам придется передать макросу всю строку, что досадно.
Однако процедурные макросы могут быть полезны, поскольку они способны объединять литералы сами по себе, таким образом передавая готовый литерал в TS
. Для этого можно было бы использовать существующий ящик, но я его не нашел.
Спасибо, тогда попробую разобраться!
Обновление: это сработало, я только что сделал это сам! Большое спасибо!
Да, это обычная проблема с макросами. Это должен быть буквально строковый литерал, а не просто что-то, что оценивается как строковый литерал. Очень надоедливый.