我正在学习一些宏,并尝试使用它们轻松地将我的东西导出到正确的目录中。 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)
假设你不控制
TS
宏并且无法更改它,这确实是一个问题。如果宏需要一个文字,则扩展为文字的某些内容(例如 concat!()
将不起作用。
声明性宏 (
macro_rules!
) 无法自行解决此问题。如果您想坚持使用它们,则必须将整个字符串传递给宏,这是不幸的。
然而,过程宏可能会有所帮助,因为它们能够自行连接文字,从而将现成的文字传递给TS
。也许可以使用现有的板条箱来实现这一点,尽管我找不到任何板条箱。