From 9b0fb35ed553eb9ac090cb3a567301f1eca26714 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Thu, 16 Aug 2018 22:53:50 -0500 Subject: [PATCH] magic: Use an iterator to generate the byte stream Instead of explicitly writing the byte array for the magic packet content, the `MagicPacket.send` method now delegates to `MagicPacketIterator`. It collects the values the iterator produces, which are determined based on the number of times the `next` method has been called, into a vector, and then passes a slice of that vector to the `send` method of the UDP socket. Using a vector of course requires allocating space on the heap, so while this method is probably not as efficient as the previous stack-allocated static array, it is certainly cleaner and easier to understand. --- src/magic.rs | 64 ++++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/src/magic.rs b/src/magic.rs index 13f2fb2..d9b3cff 100644 --- a/src/magic.rs +++ b/src/magic.rs @@ -16,44 +16,34 @@ impl MagicPacket { let socket = net::UdpSocket::bind("0.0.0.0:0")?; socket.set_broadcast(true)?; socket.connect("255.255.255.255:9")?; - socket.send(&self.to_buf()) + let buf: Vec = self.iter().collect(); + socket.send(&buf[..102]) } - pub fn to_buf(&self) -> [u8; 102] { - [ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - self.addr[0], self.addr[1], self.addr[2], - self.addr[3], self.addr[4], self.addr[5], - ] + fn iter(&self) -> MagicPacketIterator { + MagicPacketIterator { + packet: self, + pos: 0, + } + } +} + + +struct MagicPacketIterator<'a> { + packet: &'a MagicPacket<'a>, + pos: usize, +} + + +impl<'a> Iterator for MagicPacketIterator<'a> { + type Item = u8; + + fn next(&mut self) -> Option { + self.pos += 1; + match self.pos { + 1 ... 6 => Some(0xff), + 7 ... 103 => Some(self.packet.addr[(self.pos - 7) % 6]), + _ => None, + } } }