競技プログラミングで必要なライブラリのコピペ作業を補助するツールです。
cargo install --git https://github.com/shino16/cargo-auto-bundle
cargo-auto-bundle [--crate <crate [default: .]>] [--entry-point <entry-point [default: src/main.rs]>]
<crate>/Cargo.toml
をパースし、クレート名を取得します。<entry-point>
ファイルを起点に対象クレートの要素(モジュール/その他)に対するuse
宣言とmod
宣言を辿り、依存するファイルを列挙します。- これらのファイルを
<entry-point>
ファイルとまとめて出力します。このとき、- ファイル構造は
(公開性) mod (モジュール名) { ... }
という形で反映されます。 - 該当ファイル中の
use crate::...
はuse crate::(クレート名)::...
で置き換えられます。 - 該当ファイル中の
(公開性) mod (モジュール名);
は削除されます。 <entry-point>
中のuse (クレート名)::...
はuse crate::(クレート名)::...
で置き換えられます。
- ファイル構造は
- 相対パスに対応していません。 対象クレート内の要素に対して
use
宣言を行うとき、<entry-point>
内ではuse <crate>::...
、<crate>
内ではuse crate::...
のように書いてください。 use
宣言されていないモジュールは、使われていたとしても走査対象になりません。例えばlet inv = my_library::math::modpow(n, MOD - 2, MOD);
のような記述があっても、use my_library::math;
のような記述がなければmath
モジュールは出力に反映されません。use
宣言以外の場所でcrate::...
と書かれていても、crate::(クレート名)
には置き換えられません。- モジュールの
path
属性は考慮しません。 - 仕組み上
mod a { pub mod b; }
というような記述があった場合にmod a
が2回定義されます。 <crate>
はライブラリクレートであることが仮定されています。- 手続きマクロやcfgの展開は一切行いません。
pub(crate)
やpub(in (パス))
に対して特別な処理は行っていません。- 動作の正当性は保証しません。本プログラムの不適切な動作によって発生したペナルティについて責任を負いません。
これらのうち1.–4.はそのうち実装するかもしれません。バイナリクレートも対応したほうが良いですか? 7.の前半はさすがに厳しいです。あとは、うーん…
作者本人がまだあまり使っていないので、バグを含んでいても気づいていない可能性があります。何かあれば連絡いただければ幸いです。