1use osc_codec10::{decode_bundle, decode_message};
2use osc_types10::OscPacket;
3use std::net::UdpSocket;
4
5fn count_items_in_bundle(bundle: &osc_types10::Bundle) -> (usize, usize) {
6 let mut messages = 0;
7 let mut bundles = 0;
8 for packet in &bundle.packets {
9 match packet {
10 OscPacket::Message(_) => messages += 1,
11 OscPacket::Bundle(nested) => {
12 bundles += 1;
13 let (nested_msgs, nested_bundles) = count_items_in_bundle(nested);
14 messages += nested_msgs;
15 bundles += nested_bundles;
16 }
17 }
18 }
19 (messages, bundles)
20}
21
22fn main() -> std::io::Result<()> {
23 let sock = UdpSocket::bind("0.0.0.0:9000")?;
24 println!("listening on 9000");
25 let mut buf = [0u8; 65536];
26 loop {
27 let (n, _src) = sock.recv_from(&mut buf)?;
28 let data = &buf[..n];
29 match data.first().copied() {
31 Some(b'/') => {
32 let (msg, used) = decode_message(data).expect("decode message");
33 assert_eq!(used, data.len());
34 println!("msg {} args={}", msg.address, msg.args.len());
35 }
36 Some(b'#') => {
37 let (bundle, _used) = decode_bundle(data).expect("decode bundle");
38 let (total_messages, total_bundles) = count_items_in_bundle(&bundle);
39 println!(
40 "bundle timetag={} direct_packets={} total_messages={} total_bundles={}",
41 bundle.timetag,
42 bundle.packets.len(),
43 total_messages,
44 total_bundles
45 );
46 }
47 _ => eprintln!("unknown packet"),
48 }
49 }
50}