Skip to main content

interleaved_temp_storage/
interleaved_temp_storage.rs

1use std::{
2    io::{Read, Write},
3    thread,
4};
5
6use midi_toolkit::io::InterleavedTempFile;
7
8fn main() {
9    let storage = InterleavedTempFile::new_temp().unwrap();
10    let mut handles = Vec::new();
11
12    for stream_index in 0..4 {
13        let mut writer = storage.spawn_stream();
14        handles.push(thread::spawn(move || {
15            let stream_id = writer.stream_id();
16            let chunks = [
17                format!("track-{stream_index}:header|"),
18                format!("track-{stream_index}:events|"),
19                format!("track-{stream_index}:tail"),
20            ];
21
22            let mut expected = String::new();
23            for chunk in chunks {
24                writer.write_all(chunk.as_bytes()).unwrap();
25                expected.push_str(&chunk);
26            }
27
28            writer.flush().unwrap();
29            (stream_id, expected)
30        }));
31    }
32
33    let mut expected_streams = Vec::new();
34    for handle in handles {
35        expected_streams.push(handle.join().unwrap());
36    }
37    expected_streams.sort_unstable_by_key(|(stream_id, _)| *stream_id);
38
39    println!("Backing file: {}", storage.path().display());
40    for (stream_id, expected) in expected_streams {
41        let mut reader = storage.open_reader(stream_id).unwrap();
42        let mut actual = String::new();
43        reader.read_to_string(&mut actual).unwrap();
44
45        assert_eq!(actual, expected);
46        println!("stream {stream_id}: {actual}");
47    }
48}