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