/
IPv6Address.purs
41 lines (33 loc) · 1.18 KB
/
IPv6Address.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
module URI.Host.IPv6Address
( IPv6Address
, unsafeFromString
, unsafeToString
, parser
) where
import Prelude
import Control.Alt ((<|>))
import Data.Array as Array
import Data.String as String
import Text.Parsing.Parser (Parser)
import Text.Parsing.Parser.Combinators ((<?>))
import Text.Parsing.Parser.String (char)
import Text.Parsing.Parser.Token (hexDigit)
-- | This type and parser are much too forgiving currently, allowing almost
-- | anything through that looks vaguely IPv6ish.
newtype IPv6Address = IPv6Address String
derive newtype instance eqIPv6Address ∷ Eq IPv6Address
derive newtype instance ordIPv6Address ∷ Ord IPv6Address
instance showIPv6Address ∷ Show IPv6Address where
show (IPv6Address s) = "(IPv6Address.unsafeFromString " <> show s <> ")"
unsafeFromString ∷ String → IPv6Address
unsafeFromString = IPv6Address
unsafeToString ∷ IPv6Address → String
unsafeToString (IPv6Address s) = "[" <> s <> "]"
parser ∷ Parser String IPv6Address
parser =
IPv6Address
<$> (char '[' *> (String.fromCharArray <$> Array.some ipv6Char) <* char ']')
<?> "IPv6 address"
where
ipv6Char ∷ Parser String Char
ipv6Char = hexDigit <|> char ':' <|> char '.'