コンテンツにスキップ
これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.

DatagramBuilder

DatagramBuilder は送信するコマンドを積み上げ, Frames へ変換する構造体. Client::datagram_builder で得る.

push でコマンドを積み, buildFrames に変換する. 得られた Frames は複数の Frame に分割し, Client::send / send_checked で 1 フレームずつ送信する.

let mut builder = client.datagram_builder();
builder.push(SetSilencer::default());
let frames = builder.build()?;
for frame in &frames {
client.send_checked(frame).await?;
}
メソッド 説明
push(cmd) 全デバイス共通のコマンドを積む
push_each(assign) デバイスごとに異なるコマンドを積む (下記参照)
build() 積んだコマンドを Frames に変換する

push_each はデバイスを引数にするクロージャを受け取り, デバイスごとに異なるコマンドを割り当てる. Rust では FnMut(&Device) -> Option<C>, Python では Callable[[Device], Command | None], C# では Func<Device, ICommand?>. None を返したデバイスには, そのステップで何も割り当てない.

let mut builder = client.datagram_builder();
builder.push_each(|device| {
Some(if device.idx() % 2 == 0 {
Pattern::new(&left)
} else {
Pattern::new(&right)
})
});
let frames = builder.build()?;

Rust ではクロージャの返り値はすべて同じ型でなければならない. 型の異なるコマンドを混在させたい場合は, Command::boxedBoxedCommand に揃えるか, push_eachを型ごとに呼ぶ. Python は動的型付けのため, デバイスごとに異なる型のコマンドをそのまま返せる.

let mut builder = client.datagram_builder();
builder.push_each(|device| {
Some(if device.idx() % 2 == 0 {
Pattern::new(&left).boxed()
} else {
Modulation::new(SamplingConfig::FREQ_4K, &modulation).boxed()
})
});
let frames = builder.build()?;