module Net.Mac.ByteString.Char8
( encode
, decode
, builder
, parser
) where
import Net.Mac
import Data.ByteString (ByteString)
import Data.Attoparsec.ByteString.Char8 (Parser)
import Data.ByteString.Lazy.Builder (Builder)
import Net.Internal (rightToMaybe)
import Data.Text.Encoding (encodeUtf8, decodeUtf8')
import Control.Monad
import qualified Data.ByteString.Builder as Builder
import qualified Data.Attoparsec.ByteString.Char8 as AB
import qualified Net.Mac.Text as MacText
encode :: Mac -> ByteString
encode = encodeUtf8 . MacText.encode
decode :: ByteString -> Maybe Mac
decode = MacText.decode <=< rightToMaybe . decodeUtf8'
builder :: Mac -> Builder
builder = Builder.byteString . encode
parser :: Parser Mac
parser = fromOctets'
<$> (AB.hexadecimal >>= limitSize)
<* AB.char ':'
<*> (AB.hexadecimal >>= limitSize)
<* AB.char ':'
<*> (AB.hexadecimal >>= limitSize)
<* AB.char ':'
<*> (AB.hexadecimal >>= limitSize)
<* AB.char ':'
<*> (AB.hexadecimal >>= limitSize)
<* AB.char ':'
<*> (AB.hexadecimal >>= limitSize)
where
limitSize i =
if i > 255
then fail "All octets in a mac address must be between 00 and FF"
else return i