64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
|
package egoscale
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"net"
|
||
|
)
|
||
|
|
||
|
// MACAddress is a nicely JSON serializable net.HardwareAddr
|
||
|
type MACAddress net.HardwareAddr
|
||
|
|
||
|
// String returns the MAC address in standard format
|
||
|
func (mac MACAddress) String() string {
|
||
|
return (net.HardwareAddr)(mac).String()
|
||
|
}
|
||
|
|
||
|
// MAC48 builds a MAC-48 MACAddress
|
||
|
func MAC48(a, b, c, d, e, f byte) MACAddress {
|
||
|
m := make(MACAddress, 6)
|
||
|
m[0] = a
|
||
|
m[1] = b
|
||
|
m[2] = c
|
||
|
m[3] = d
|
||
|
m[4] = e
|
||
|
m[5] = f
|
||
|
return m
|
||
|
}
|
||
|
|
||
|
// UnmarshalJSON unmarshals the raw JSON into the MAC address
|
||
|
func (mac *MACAddress) UnmarshalJSON(b []byte) error {
|
||
|
var addr string
|
||
|
if err := json.Unmarshal(b, &addr); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
hw, err := ParseMAC(addr)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
*mac = make(MACAddress, 6)
|
||
|
copy(*mac, hw)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// MarshalJSON converts the MAC Address to a string representation
|
||
|
func (mac MACAddress) MarshalJSON() ([]byte, error) {
|
||
|
return []byte(fmt.Sprintf("%q", mac.String())), nil
|
||
|
}
|
||
|
|
||
|
// ParseMAC converts a string into a MACAddress
|
||
|
func ParseMAC(s string) (MACAddress, error) {
|
||
|
hw, err := net.ParseMAC(s)
|
||
|
return (MACAddress)(hw), err
|
||
|
}
|
||
|
|
||
|
// MustParseMAC acts like ParseMAC but panics if in case of an error
|
||
|
func MustParseMAC(s string) MACAddress {
|
||
|
mac, err := ParseMAC(s)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
return mac
|
||
|
}
|