module Text.IPv6Addr
(
IPv6Addr
, maybeIPv6Addr
, maybePureIPv6Addr
, maybeFullIPv6Addr
, getIPv6AddrOf
, ip6arpa
, randIPv6Addr
) where
import Control.Monad (replicateM)
import Data.Char (intToDigit,isDigit,isHexDigit,toLower)
import Data.Function (on)
import Data.List (group,isSuffixOf,elemIndex,elemIndices,intersperse)
import Data.Maybe (catMaybes,fromJust,isJust)
import qualified Data.Text as T
import Data.Text.Read (decimal)
import Numeric (showIntAtBase)
import Text.IPv6Addr.Internal
import Text.IPv6Addr.Manip (sixteenBitsArbToken,partialRandAddr)
import Text.IPv6Addr.Types
maybeIPv6Addr :: T.Text -> Maybe IPv6Addr
maybeIPv6Addr t = maybeTokIPv6Addr t >>= ipv6TokensToIPv6Addr
maybePureIPv6Addr :: T.Text -> Maybe IPv6Addr
maybePureIPv6Addr t = maybeTokPureIPv6Addr t >>= ipv6TokensToIPv6Addr
maybeFullIPv6Addr :: T.Text -> Maybe IPv6Addr
maybeFullIPv6Addr t =
maybeTokPureIPv6Addr t >>= \m -> ipv6TokensToIPv6Addr $ expandTokens $ fromDoubleColon m
ip6arpa :: T.Text -> Maybe T.Text
ip6arpa t =
case maybeFullIPv6Addr t of
Just (IPv6Addr a) -> Just $ revaddr a T.empty
Nothing -> Nothing
where
revaddr i o =
if i == T.empty then o `T.append` T.pack "ip6.arpa."
else do let c = T.last i
revaddr (T.init i)
(if c /= ':' then o `T.append` T.pack [c] `T.append` T.pack "." else o)
getIPv6AddrOf :: String -> IO (Maybe IPv6Addr)
getIPv6AddrOf s = do
l <- networkInterfacesIPv6AddrList
case lookup s l of
Just a -> return $ maybeIPv6Addr $ T.pack $ show a
Nothing -> return Nothing
randIPv6Addr :: IO IPv6Addr
randIPv6Addr = partialRandAddr 8 >>= \p -> return $ IPv6Addr $ ipv6TokensToText p