IP addresses: slight change in errors naming.

master
Philippe Pittoli 2024-02-10 15:36:30 +01:00
parent d7f713839c
commit 51bdcc3ba4
1 changed files with 13 additions and 14 deletions

View File

@ -19,19 +19,18 @@ import GenericParser.SomeParsers (nat)
import GenericParser.RFC5234 (hexdig) import GenericParser.RFC5234 (hexdig)
data IPv6Error data IPv6Error
= InvalidCharacter = IP6TooManyHexaDecimalCharacters
| TooManyHexaDecimalCharacters | IP6NotEnoughChunks
| NotEnoughChunks | IP6TooManyChunks
| TooManyChunks | IP6UnrelevantShortRepresentation
| IPv6UnrelevantShortRepresentation
-- | `ipv6_chunk` parses just a group of hexadecimal characters. -- | `ipv6_chunk` parses just a group of hexadecimal characters.
-- | Return an error (TooManyHexaDecimalCharacters) in case the group has more than 4 characters. -- | Return an error (IP6TooManyHexaDecimalCharacters) in case the group has more than 4 characters.
ipv6_chunk :: Parser IPv6Error String ipv6_chunk :: Parser IPv6Error String
ipv6_chunk = do pos <- current_position ipv6_chunk = do pos <- current_position
hexachars <- many1 hexdig hexachars <- many1 hexdig
if A.length hexachars > 4 if A.length hexachars > 4
then Parser \_ -> failureError pos (Just TooManyHexaDecimalCharacters) then Parser \_ -> failureError pos (Just IP6TooManyHexaDecimalCharacters)
else pure $ CU.fromCharArray hexachars else pure $ CU.fromCharArray hexachars
-- | `ipv6_chunk'` is `ipv6_chunk` with a following ':' character. -- | `ipv6_chunk'` is `ipv6_chunk` with a following ':' character.
@ -52,9 +51,9 @@ ipv6_full = do chunks <- many1 ipv6_chunk'
pos <- current_position pos <- current_position
lastchunk <- ipv6_chunk lastchunk <- ipv6_chunk
case compare (A.length chunks) 7 of case compare (A.length chunks) 7 of
LT -> Parser \_ -> failureError pos (Just NotEnoughChunks) LT -> Parser \_ -> failureError pos (Just IP6NotEnoughChunks)
EQ -> pure $ A.fold (A.intersperse ":" (chunks <> [lastchunk])) EQ -> pure $ A.fold (A.intersperse ":" (chunks <> [lastchunk]))
GT -> Parser \_ -> failureError pos (Just TooManyChunks) GT -> Parser \_ -> failureError pos (Just IP6TooManyChunks)
-- | `ipv6_shortened` parses a shortened representation of an IPv6 address. -- | `ipv6_shortened` parses a shortened representation of an IPv6 address.
ipv6_shortened :: Parser IPv6Error String ipv6_shortened :: Parser IPv6Error String
@ -73,7 +72,7 @@ ipv6_shortened =
let nb_zero_filling = 8 - (A.length chunks_part1 + A.length chunks_part2) let nb_zero_filling = 8 - (A.length chunks_part1 + A.length chunks_part2)
filling = repeat nb_zero_filling "0000" filling = repeat nb_zero_filling "0000"
if nb_zero_filling < 1 if nb_zero_filling < 1
then Parser \_ -> failureError pos (Just IPv6UnrelevantShortRepresentation) then Parser \_ -> failureError pos (Just IP6UnrelevantShortRepresentation)
else pure $ A.fold (A.intersperse ":" $ A.concat [chunks_part1, filling, chunks_part2]) else pure $ A.fold (A.intersperse ":" $ A.concat [chunks_part1, filling, chunks_part2])
-- | TODO: accept IPv6 addresses between brackets ([ipv6]). -- | TODO: accept IPv6 addresses between brackets ([ipv6]).
@ -81,15 +80,15 @@ ipv6 :: Parser IPv6Error String
ipv6 = ipv6_shortened <|> ipv6_full ipv6 = ipv6_shortened <|> ipv6_full
data IPv4Error data IPv4Error
= NumberTooBig Int = IP4NumberTooBig Int
| IPv4UnrelevantShortRepresentation | IP4UnrelevantShortRepresentation
-- | `ipv4_byte` a parser for 0 to 255 natural integers, which is part of the representation of an IPv4 address. -- | `ipv4_byte` a parser for 0 to 255 natural integers, which is part of the representation of an IPv4 address.
ipv4_byte :: Parser IPv4Error Int ipv4_byte :: Parser IPv4Error Int
ipv4_byte = do pos <- current_position ipv4_byte = do pos <- current_position
number <- nat number <- nat
if number > 255 if number > 255
then Parser \_ -> failureError pos ((Just <<< NumberTooBig) number) then Parser \_ -> failureError pos ((Just <<< IP4NumberTooBig) number)
else pure number else pure number
-- | `ipv4_byte'` is `ipv4_byte` with a leading '.'. -- | `ipv4_byte'` is `ipv4_byte` with a leading '.'.
@ -123,7 +122,7 @@ ipv4_shortened =
nb_zero_filling = 4 - (A.length chunks_part1 + A.length chunks_part2) nb_zero_filling = 4 - (A.length chunks_part1 + A.length chunks_part2)
filling = A.fold (A.intersperse "." $ repeat nb_zero_filling "0") filling = A.fold (A.intersperse "." $ repeat nb_zero_filling "0")
if nb_zero_filling < 1 if nb_zero_filling < 1
then Parser \_ -> failureError pos (Just IPv4UnrelevantShortRepresentation) then Parser \_ -> failureError pos (Just IP4UnrelevantShortRepresentation)
else pure $ A.fold (A.intersperse "." [part1, filling, part2]) else pure $ A.fold (A.intersperse "." [part1, filling, part2])
ipv4 :: Parser IPv4Error String ipv4 :: Parser IPv4Error String