m13o.net

2020-12-06 Sun 18:10
Rustのワークスペース   AdventCalendar2020 Rust programming

前回まで実装していたBinaryReaderを利用して適当なバイナリファイルを読む別のcrateを作ってみようと思います. binary_readerに依存する形のcrateになるので, binary_readerとは違うプロジェクトを作る必要があります. こうした時に, その他のプロジェクトからbinary_reader crateを参照するためにとれる手段はいくつか考えられますが, 今回はRust……というかCargoのワークスペースという機能を利用して開発を進めていこうと思います.

なお, ワークスペースについては公式が用意してくれているドキュメントを読むとだいたい雰囲気は掴む事ができます.

さて, 今binary_readerというディレクトリにbinary_reader crateを実装していたわけですが, このbinary_readerをワークスペースに内包するルートを作る必要があります. mkdir等で適当にディレクトリを作成します. 今回はアドベントカレンダー用の何かなので, advent_calendar_2020というディレクトリ名にしました.

mkdir advent_calendar_2020

このディレクトリの中に, 以下のような記述をしたCargo.tomlファイルを作成します.

[workspace]
members = [
    "binary_reader",
]

[workspace]以下がワークスペースに関する設定を記述する場所で, membersはこのワークスペースに内包される個々のcrateのディレクトリパスへの配列です. 今はまだbinary_readerしかありませんが, 今後このアドベントカレンダーを続けていくにあたり, 関連する物がこのmembersに追記されていく事になります.

最後に, binary_readerのディレクトリをadvent_calendar_2020ディレクトリ内に移動させます. この時, targetディレクトリなどビルド成果物を内包するディレクトリは不要なので削除しておきます.

rm -rf binary_reader/target
mv binary_reader advent_calender_2020/

試しにcargo testを走らせてみましょう.

cargo test
   Compiling binary_reader v0.1.0 (/path/to/you/advent_calendar_2020/binary_reader)
    Finished test [unoptimized + debuginfo] target(s) in 2.17s
     Running target/debug/deps/binary_reader-a5bac88a7747c730

running 27 tests
test binary_reader::tests::read_buffer_overrun ... ok
test binary_reader::tests::read_bytes ... ok
test binary_reader::tests::read_empty_buffer ... ok
test binary_reader::tests::read_empty_buffer_and_zero_byte ... ok
test binary_reader::tests::read_i8 ... ok
test binary_reader::tests::read_le_f32_infinity ... ok
test binary_reader::tests::read_le_f32_nan ... ok
test binary_reader::tests::read_le_f32_neg_infinity ... ok
test binary_reader::tests::read_le_f32_one ... ok
test binary_reader::tests::read_le_i16_minus_one ... ok
test binary_reader::tests::read_le_i16_signed_max ... ok
test binary_reader::tests::read_le_i16_signed_min ... ok
test binary_reader::tests::read_le_i24_minus_one ... ok
test binary_reader::tests::read_le_i24_signed_max ... ok
test binary_reader::tests::read_le_i24_signed_min ... ok
test binary_reader::tests::read_le_i32_minus_one ... ok
test binary_reader::tests::read_le_i32_signed_max ... ok
test binary_reader::tests::read_le_i32_signed_min ... ok
test binary_reader::tests::read_le_u16 ... ok
test binary_reader::tests::read_le_u24 ... ok
test binary_reader::tests::read_le_u32 ... ok
test binary_reader::tests::read_le_u32_not_enough_byte_count ... ok
test binary_reader::tests::read_u8 ... ok
test binary_reader::tests::read_zero_byte ... ok
test error::tests::buffer_over_run_error_debug ... ok
test error::tests::buffer_over_run_error_display ... ok
test error::tests::buffer_over_run_error_source ... ok

test result: ok. 27 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests binary_reader

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

はい, 無事動きテストもパスします.

これでワークスペースを利用する準備が整いましたので, binary_reader crateを利用して何かバイナリデータを読み取る別のcrateをこのワークスペース内で構築してみたいと思います. 今回はRIFFフォーマットをベースに構築されている皆大好きwavファイルを読み取るcrateを作ってみようと思います. 名前は安直にwavとでもしておきましょう.

ルートディレクトリにあるCargo.tomlにwavがこのワークスペースのメンバーであるという事を記載します.

[workspace]
members = [
    "binary_reader",
    "wav", # <- new!
]

その後, cargo new でwav crateのパッケージを生成します.

cargo new --lib wav

advent_calender_2020以下のディレクトリ構成としては以下のような形となっています.

.
├── Cargo.lock
├── Cargo.toml
├── binary_reader
│   ├── Cargo.lock
│   ├── Cargo.toml
│   └── src
│       ├── binary_reader.rs
│       ├── error.rs
│       └── lib.rs
└── wav
    ├── Cargo.toml
    └── src
        └── lib.rs

では, 次回以降, wavファイルを読み取るcrateを実装していこうと思います.