ip-0.8.3: test/IPv4DecodeText2.hs
module IPv4DecodeText2 where
import Net.Types
import Data.Monoid ((<>))
import Data.Word
import Data.Bits ((.&.),(.|.),shiftR,shiftL,complement)
import Control.Monad.ST
import Data.Text.Internal (Text(..))
import Data.Text.Lazy.Builder.Int (decimal)
import Control.Monad
import qualified Data.Text as Text
import qualified Data.Text.Lazy as LText
import qualified Data.Attoparsec.Text as AT
import qualified Data.Text.Array as TArray
import qualified Data.Text.Lazy.Builder as TBuilder
import qualified Data.Text.Read as TextRead
import qualified Data.Text.Lazy.Builder.Int as TBuilder
dotDecimalParser :: AT.Parser Word32
dotDecimalParser = fromOctets'
<$> (AT.decimal >>= limitSize)
<* AT.char '.'
<*> (AT.decimal >>= limitSize)
<* AT.char '.'
<*> (AT.decimal >>= limitSize)
<* AT.char '.'
<*> (AT.decimal >>= limitSize)
where
limitSize i =
if i > 255
then fail ipOctetSizeErrorMsg
else return i
decodeText :: Text -> Maybe IPv4
decodeText t = case AT.parseOnly (dotDecimalParser <* AT.endOfInput) t of
Left _ -> Nothing
Right w -> Just (IPv4 w)
ipOctetSizeErrorMsg :: String
ipOctetSizeErrorMsg = "All octets in an IPv4 address must be between 0 and 255"
fromOctets' :: Word32 -> Word32 -> Word32 -> Word32 -> Word32
fromOctets' a b c d =
( shiftL a 24
.|. shiftL b 16
.|. shiftL c 8
.|. d
)