Skip to content

Commit

Permalink
Support core::fmt::Display and alternative formats. (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
reitermarkus authored and svartalf committed Dec 29, 2019
1 parent 16784c4 commit 0f0916a
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 54 deletions.
13 changes: 11 additions & 2 deletions src/addr.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#[cfg(feature = "std")]
use ::std::str::FromStr;
use std::{fmt, str::FromStr};

#[cfg(not(feature = "std"))]
use core::str::FromStr;
use core::{fmt, str::FromStr};

use crate::{parser, MacAddr6, MacAddr8, ParseError};

Expand Down Expand Up @@ -101,3 +101,12 @@ impl From<[u8; 8]> for MacAddr {
MacAddr::V8(MacAddr8::from(bytes))
}
}

impl fmt::Display for MacAddr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
MacAddr::V6(v6) => fmt::Display::fmt(v6, f),
MacAddr::V8(v8) => fmt::Display::fmt(v8, f),
}
}
}
56 changes: 33 additions & 23 deletions src/addr6.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
#[cfg(feature = "std")]
use ::std::str::FromStr;
use std::{fmt, str::FromStr};

#[cfg(not(feature = "std"))]
use core::str::FromStr;

#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use core::{fmt, str::FromStr};

use crate::parser;

/// MAC address in *EUI-48* format.
#[repr(C)]
#[derive(Debug, Default, Hash, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MacAddr6([u8; 6]);

impl MacAddr6 {
Expand Down Expand Up @@ -200,24 +197,37 @@ impl AsMut<[u8]> for MacAddr6 {
}
}

#[cfg(feature = "std")]
mod std {
use std::fmt;

use super::MacAddr6;

impl fmt::Display for MacAddr6 {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// `MacAddr6` can be displayed in different formats.
///
/// # Example
///
/// ```
/// # use macaddr::MacAddr6;
/// let addr = MacAddr6::new(0xab, 0x0d, 0xef, 0x12, 0x34, 0x56);
///
/// assert_eq!(&format!("{}", addr), "AB:0D:EF:12:34:56");
/// assert_eq!(&format!("{:-}", addr), "AB-0D-EF-12-34-56");
/// assert_eq!(&format!("{:#}", addr), "AB0.DEF.123.456");
/// ```
impl fmt::Display for MacAddr6 {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if f.sign_minus() {
f.write_fmt(format_args!(
"{:02X}-{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5],
))
} else if f.alternate() {
let p1 = u16::from(self.0[0]) * 16 + u16::from(self.0[1] / 16);
let p2 = u16::from(self.0[1] % 16) * 256 + u16::from(self.0[2]);
let p3 = u16::from(self.0[3]) * 16 + u16::from(self.0[4] / 16);
let p4 = u16::from(self.0[4] % 16) * 256 + u16::from(self.0[5]);

f.write_fmt(format_args!("{:03X}.{:03X}.{:03X}.{:03X}", p1, p2, p3, p4,))
} else {
f.write_fmt(format_args!(
// Canonical form
"{:02X}-{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
self.0[0],
self.0[1],
self.0[2],
self.0[3],
self.0[4],
self.0[5],
))
"{:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}",
self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5],
))
}
}
}
56 changes: 31 additions & 25 deletions src/addr8.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
#[cfg(feature = "std")]
use ::std::str::FromStr;
use std::{fmt, str::FromStr};

#[cfg(not(feature = "std"))]
use core::str::FromStr;

#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use core::{fmt, str::FromStr};

use crate::parser;

/// MAC address in *EUI-64* format.
#[repr(C)]
#[derive(Debug, Default, Hash, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MacAddr8([u8; 8]);

impl MacAddr8 {
Expand Down Expand Up @@ -200,26 +197,35 @@ impl AsMut<[u8]> for MacAddr8 {
}
}

#[cfg(feature = "std")]
mod std {
use std::fmt;

use super::MacAddr8;

impl fmt::Display for MacAddr8 {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
/// `MacAddr8` can be displayed in different formats.
///
/// # Example
///
/// ```
/// # use macaddr::MacAddr8;
/// let addr = MacAddr8::new(0xab, 0x0d, 0xef, 0x12, 0x34, 0x56, 0x78, 0x9A);
///
/// assert_eq!(&format!("{}", addr), "AB:0D:EF:12:34:56:78:9A");
/// assert_eq!(&format!("{:-}", addr), "AB-0D-EF-12-34-56-78-9A");
/// assert_eq!(&format!("{:#}", addr), "AB0D.EF12.3456.789A");
/// ```
impl fmt::Display for MacAddr8 {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if f.sign_minus() {
f.write_fmt(format_args!(
"{:02X}-{:02X}-{:02X}-{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5], self.0[6], self.0[7],
))
} else if f.alternate() {
f.write_fmt(format_args!(
"{:02X}{:02X}.{:02X}{:02X}.{:02X}{:02X}.{:02X}{:02X}",
self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5], self.0[6], self.0[7],
))
} else {
f.write_fmt(format_args!(
// Canonical form
"{:02X}-{:02X}-{:02X}-{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
self.0[0],
self.0[1],
self.0[2],
self.0[3],
self.0[4],
self.0[5],
self.0[6],
self.0[7],
))
"{:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}",
self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5], self.0[6], self.0[7],
))
}
}
}
8 changes: 4 additions & 4 deletions src/parser/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
#[cfg(feature = "std")]
use std::error::Error;
#[cfg(feature = "std")]
use std::fmt;
use std::{error::Error, fmt};

#[cfg(not(feature = "std"))]
use core::fmt;

use crate::{MacAddr, MacAddr6, MacAddr8};

Expand Down Expand Up @@ -31,7 +32,6 @@ pub enum ParseError {
InvalidCharacter(char, usize),
}

#[cfg(feature = "std")]
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Expand Down
4 changes: 4 additions & 0 deletions src/parser/tests.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
#[cfg(feature = "std")]
use std::str::FromStr;

#[cfg(not(feature = "std"))]
use core::str::FromStr;

use assert_matches::assert_matches;

use crate::{MacAddr, MacAddr6, MacAddr8};
Expand Down

0 comments on commit 0f0916a

Please sign in to comment.