mac: Add MacAddress type
The `MacAddress` structure represents a 48-bit hardware address. Using a dedicated type instead of an array will make it easier to validate inputs and ensure type safety.master
parent
8b0ce4c5be
commit
c0b462d8ac
|
@ -0,0 +1,24 @@
|
|||
use std::num;
|
||||
|
||||
|
||||
pub struct MacAddress {
|
||||
addr: [u8; 6],
|
||||
}
|
||||
|
||||
|
||||
impl MacAddress {
|
||||
pub fn from_string(s: &str) -> Result<Self, num::ParseIntError> {
|
||||
s.split(":")
|
||||
.map(|b| u8::from_str_radix(b, 16))
|
||||
.collect::<Result<Vec<u8>, _>>()
|
||||
.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
|
||||
}
|
||||
}
|
13
src/magic.rs
13
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<usize> {
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue