Процедурные макросы

День добрый.
Добрался до изучения процедурных макросов и сразу столкнулся с проблемой организации кода. Из доков понял что проц.макросы должны описываться в отдельных ящиках.
Как организовываются ящики внутри ящиков ?

Создал пакет в нём автоматом создался основной ящик в папке 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" }
1 лайк

cargo/bin это один из каталогов Cargo в который он смотрит и собирает лежащие в нем файлы как отдельные исполняемые бинари.
Ссылка на документацию
https://doc.rust-lang.org/cargo/reference/cargo-targets.html#binaries

Тенкс. Пойду пробовать.

Вот еще почитать про организацию нескольких ящиков
https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html

Господа, как и в какую структуру парсить вот такую строку 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.
Через нее можно увидеть что сформировалось в итоге.

Тенкс, нашёл подход как это делается, пока вопросов нет.