module Net.Mac.Text
( encode
, encodeWith
, decode
, decodeWith
, decodeEither
, decodeEitherWith
, builder
, parser
, parserWith
) where
import Net.Types (Mac(..),MacEncoding(..),MacDecoding(..))
import Net.Mac (fromOctetsNoCast)
import Data.Text (Text)
import Data.Word (Word8)
import Data.Char (chr)
import qualified Net.Internal as Internal
import qualified Data.Attoparsec.Text as AT
import qualified Data.Text.Lazy.Builder as TBuilder
encode :: Mac -> Text
encode (Mac a b) = Internal.macToTextPreAllocated 58 False a b
decodeEitherWith :: MacDecoding -> Text -> Either String Mac
decodeEitherWith (MacDecoding separator) =
Internal.macFromText' (fmap w8ToChar separator) fromOctetsNoCast
decodeEither :: Text -> Either String Mac
decodeEither = decodeEitherWith defDecoding
decode :: Text -> Maybe Mac
decode = decodeWith defDecoding
decodeWith :: MacDecoding -> Text -> Maybe Mac
decodeWith d = Internal.rightToMaybe . decodeEitherWith d
builder :: Mac -> TBuilder.Builder
builder (Mac a b) = Internal.macToTextBuilder a b
parser :: AT.Parser Mac
parser = parserWith defDecoding
parserWith :: MacDecoding -> AT.Parser Mac
parserWith (MacDecoding separator) =
Internal.macTextParser (fmap w8ToChar separator) fromOctetsNoCast
encodeWith :: MacEncoding -> Mac -> Text
encodeWith (MacEncoding separator isUpperCase) (Mac a b) =
Internal.macToTextPreAllocated separator isUpperCase a b
defDecoding :: MacDecoding
defDecoding = MacDecoding (Just 58)
w8ToChar :: Word8 -> Char
w8ToChar = chr . fromIntegral