🏃

【AHC】Rustのモジュールを単一ファイルにバンドルするスクリプトを作ってみた

2024/09/21に公開

長期の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

具体例は以下のリポジトリを参考にしてください。
https://github.com/tipstar0125/robotics/blob/master/submit.sh

GitHubで編集を提案

Discussion