module Net.IPv4.Range.Text
  ( encode
  , decode
  , decodeEither
  , builder
  , parser
  , print
  ) where

import Prelude hiding (print)
import Net.Types (IPv4Range(..),IPv4(..))
import Data.Text (Text)
import Data.Word (Word8, Word32)
import qualified Data.Text.IO           as Text
import qualified Data.Attoparsec.Text   as AT
import qualified Data.Text.Lazy.Builder as TBuilder
import qualified Net.Internal           as Internal

encode :: IPv4Range -> Text
encode (IPv4Range (IPv4 w) r) = Internal.rangeToDotDecimalText w r

decodeEither :: Text -> Either String IPv4Range
decodeEither = Internal.rangeFromDotDecimalText' mkIPv4Range

decode :: Text -> Maybe IPv4Range
decode = Internal.rightToMaybe . decodeEither

builder :: IPv4Range -> TBuilder.Builder
builder (IPv4Range (IPv4 w) r) = Internal.rangeToDotDecimalBuilder w r

parser :: AT.Parser IPv4Range
parser = Internal.dotDecimalRangeParser mkIPv4Range

-- | This exists mostly for testing purposes.
print :: IPv4Range -> IO ()
print = Text.putStrLn . encode

-- internal function
mkIPv4Range :: Word32 -> Word8 -> IPv4Range
mkIPv4Range w = IPv4Range (IPv4 w)
{-# INLINE mkIPv4Range #-}