🏃
【AHC】Rustのモジュールを単一ファイルにバンドルするスクリプトを作ってみた
長期のAHCに参加していると、コードがどんどん肥大化していって、提出のために単一ファイルでコード書くのが結構しんどいです。
モジュール毎にコードを書きたくなるのですが、手動で単一ファイルにまとめるのも大分しんどいです。
これを解決するためにcargo equip
を使用する手があるのですが、以下の理由からスクリプトを自作することにしました。
- 使い方に癖がありそう。実際使ってないので、そうではないかもしれないが、使い方に慣れるぐらいなら自作した方が早そう。
- 自由度がほしい。ビジュアライザのコードも埋め込んで、そのまま提出したいので、ローカル環境だけで動かすフィーチャーフラグを付与したい、など。
作りました。
※2024/10/23: 以前のフォルダ構成だと、動作はするものの、環境によっては、main関数がない、と怒られてしまうので、構成を変更
base_file=./src/bin/$1/main.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.rs)はローカルでのみ使用
# 提出時にエラーにならないようにしておく
if [ $item = "vis" ]; then
echo '#[cfg(feature = "local")]' >> $submit_file
fi
echo "mod $item {" >> $submit_file
cat ./src/bin/$1/$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
| | |-- main.rs
| | |-- mod_a.rs
| | |-- mod_b.rs
| | |-- mod_c.rs
| | `-- vis.rs
| `-- submit.rs
`-- submit.sh
以下のコマンドで提出ファイルが生成され、実行まで行います。
bash submit.sh a
具体例は以下のリポジトリを参考にしてください。
Discussion