🏃
【AHC】Rustのモジュールを単一ファイルにバンドルするスクリプトを作ってみた
長期のAHCに参加していると、コードがどんどん肥大化していって、提出のために単一ファイルでコード書くのが結構しんどいです。
モジュール毎にコードを書きたくなるのですが、手動で単一ファイルにまとめるのも大分しんどいです。
これを解決するためにcargo equip
を使用する手があるのですが、以下の理由からスクリプトを自作することにしました。
- 使い方に癖がありそう。実際使ってないので、そうではないかもしれないが、使い方に慣れるぐらいなら自作した方が早そう。
- 自由度がほしい。ビジュアライザのコードも埋め込んで、そのまま提出したいので、ローカル環境だけで動かすフィーチャーフラグを付与したい、など。
作りました。
base_file=./src/bin/$1.rs
submit_file=./src/bin/submit.rs
rm -f $submit_file
# mod xxx; 以外を抜き出して提出ファイルに追加
cat $base_file | grep -v "^mod*" > $submit_file
# mod xxx; からxxxを抽出
items=(`cat $base_file | grep "^mod*" | sed -E "s/mod (.*);(.*)/\1/"`)
for item in "${items[@]}" ; do
echo -e "\n" >> $submit_file
# オプション
# ビジュアライザのコード(vis.mod)はローカルでのみ使用
# 提出時にエラーにならないようにしておく
if [ $item = "vis" ]; then
echo '#[cfg(feature = "local")]' >> $submit_file
fi
echo "mod $item {" >> $submit_file
cat ./src/bin/$item.rs >> $submit_file
echo "}" >> $submit_file
done
rustfmt $submit_file
# featuresを指定することでローカルではビジュアライザを動かす
cargo run -r --bin submit --features local
想定のフォルダ構成は以下の通り。
.
|-- Cargo.lock
|-- Cargo.toml
|-- src
| `-- bin
| |-- a.rs
| |-- mod_a.rs
| |-- mod_b.rs
| |-- mod_c.rs
| |-- vis.rs # ビジュアライザ用
| `-- submit.rs # 出力される提出ファイル
`-- submit.sh
以下のコマンドで提出ファイルが生成され、実行まで行います。
bash submit.sh a
具体例は以下のリポジトリを参考にしてください。
Discussion