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

import Prelude hiding (print)
import Net.Types (IPv4(..))
import Net.IPv4
import Data.Text (Text)
import Data.Coerce (coerce)
import qualified Data.Text.Read         as Text (Reader)
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 :: IPv4 -> Text
encode = Internal.toDotDecimalText . getIPv4

decodeEither :: Text -> Either String IPv4
decodeEither = coerce . Internal.decodeIPv4TextEither

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

builder :: IPv4 -> TBuilder.Builder
builder = Internal.toDotDecimalBuilder . getIPv4

reader :: Text.Reader IPv4
reader = coerce Internal.decodeIPv4TextReader

parser :: AT.Parser IPv4
parser = coerce Internal.dotDecimalParser

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