diff --git a/src/mac.rs b/src/mac.rs new file mode 100644 index 0000000..cd47382 --- /dev/null +++ b/src/mac.rs @@ -0,0 +1,24 @@ +use std::num; + + +pub struct MacAddress { + addr: [u8; 6], +} + + +impl MacAddress { + pub fn from_string(s: &str) -> Result { + s.split(":") + .map(|b| u8::from_str_radix(b, 16)) + .collect::, _>>() + .and_then(|parts| { + let mut addr = [0u8; 6]; + addr.copy_from_slice(&parts[..6]); + Ok(MacAddress { addr }) + }) + } + + pub fn as_bytes(&self) -> &[u8; 6] { + &self.addr + } +} diff --git a/src/magic.rs b/src/magic.rs index 0d729e8..47922d5 100644 --- a/src/magic.rs +++ b/src/magic.rs @@ -1,15 +1,16 @@ use std::io; use std::net; +use mac; -pub struct MagicPacket { - addr: [u8; 6], +pub struct MagicPacket<'a> { + mac: &'a mac::MacAddress, } -impl MagicPacket { - pub fn new(addr: [u8; 6]) -> Self { - MagicPacket { addr } +impl<'a> MagicPacket<'a> { + pub fn new(mac: &'a mac::MacAddress) -> Self { + MagicPacket { mac } } pub fn send(&self) -> io::Result { @@ -46,7 +47,7 @@ impl<'a> Iterator for MagicPacketIterator<'a> { self.pos += 1; match self.pos { 1 ... 6 => Some(0xff), - 7 ... 103 => Some(self.packet.addr[(self.pos - 7) % 6]), + 7 ... 103 => Some(self.packet.mac.as_bytes()[(self.pos - 7) % 6]), _ => None, } } diff --git a/src/main.rs b/src/main.rs index 2ef3a5d..350d1a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,9 @@ +mod mac; mod magic; + fn main() { - let packet = magic::MagicPacket::new([0x0c, 0x9d, 0x92, 0x0e, 0x3a, 0x41]); + let mac = mac::MacAddress::from_string("0c:9d:92:0e:3a:41").unwrap(); + let packet = magic::MagicPacket::new(&mac); packet.send().unwrap(); }