День добрый.
Добрался до изучения процедурных макросов и сразу столкнулся с проблемой организации кода. Из доков понял что проц.макросы должны описываться в отдельных ящиках.
Как организовываются ящики внутри ящиков ?
Создал пакет в нём автоматом создался основной ящик в папке src, теперь в папке srs/bin создаём файлы и они уже будут не модулями а отдельными ящиками?
Как их подключать в основной ящик?
Привет.
в src/bin это не то.
Организовать можно по разному.
Например
основной проект
src
src/lib.rs
Cargo.toml
а дополнительный в папке crates
в Cargo.toml основного можно добавить
[workspace]
members = [ "crates/*" ]
Так Cargo будет подхватывать все проекты и знать о них
Подключить можно через относительные пути
Например
дополнительный проект лежит в crates/macros-derive
В основном Cargo.toml можно добавить
macros-derive = { path = "./crates/macros-derive" }
cargo/bin это один из каталогов Cargo в который он смотрит и собирает лежащие в нем файлы как отдельные исполняемые бинари.
Ссылка на документацию
https://doc.rust-lang.org/cargo/reference/cargo-targets.html#binaries
Господа, как и в какую структуру парсить вот такую строку a,b,c,d (формируется отдельной функцией)
чтобы потом вставить в шаблоне в пару мест.
syn::parse_str::<Expr> паникует с такой строкой
#type_str = A, B, C, D
let body_part = syn::parse_str::<Expr>(&body_str).unwrap();
let gen = quote! {
impl<'a, Ot, #type_str> Alt<'a, Ot> for (#type_str)
{
fn choice(&self, input: &'a str) -> ParseResult<'a, Ot> {
#body_part
}
}
};
а как паникует?
выхлоп макроса можно посмотреть через cargo expand - это команда дополнительная для cargo.
Через нее можно увидеть что сформировалось в итоге.
Тенкс, нашёл подход как это делается, пока вопросов нет.