From eaeed9a16d39349c21187334a569676299b8f26e Mon Sep 17 00:00:00 2001 From: lurchi Date: Wed, 22 Aug 2018 19:49:17 +0200 Subject: [PATCH] introduce PsycSyntaxError and error messages --- parse.nim | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/parse.nim b/parse.nim index 99df66c..1453273 100644 --- a/parse.nim +++ b/parse.nim @@ -27,6 +27,8 @@ type cursor: int remainingPartLen: int + PsycSyntaxError = object of Exception + Validator = proc(c: char): bool proc validateTrue(c: char): bool = true @@ -41,10 +43,13 @@ proc getUntil(input: string, delimiters: openArray[char], packet: var PsycPacket result.complete = true if i > packet.cursor: result.value = input[packet.cursor .. i - 1] + else: + result.value = "" packet.cursor = i break if not validate(input[i]): - raise new(ValueError) + raise newException(PsycSyntaxError, + "invalid character '" & input[i] & "' in " & $packet.state) proc parseKeyword(input: string, packet: var PsycPacket): tuple[complete: bool, value: string] = @@ -53,8 +58,8 @@ proc parseKeyword(input: string, result = input.getUntil([' ', '\t', '\n'], packet, validate) if result.complete: packet.cursor.inc() - if result.value.isNil() or result.value.len() == 0 or result.value[0] != '_': - raise new(ValueError) # name does not start with '_' + if result.value.len() == 0 or result.value[0] != '_': + raise newException(PsycSyntaxError, $packet.state & " does not start with '_'") proc parseModifierValueLength(input: string, packet: var PsycPacket): tuple[complete: bool, @@ -64,10 +69,13 @@ proc parseModifierValueLength(input: string, return (false, -1) packet.cursor.inc() if value.len() == 0: - raise new(ValueError) # no value length - result = (true, value.parseInt()) # may throw ValueError if invalid number + raise newException(PsycSyntaxError, "missing length after " & $packet.state) + try: + result = (true, value.parseInt()) # may throw ValueError if invalid number + except ValueError: + raise newException(PsycSyntaxError, "invalid length after " & $packet.state) if result.value < 0: - raise new(ValueError) # negative value length + raise newException(PsycSyntaxError, "invalid length after " & $packet.state) proc parseModifierName(input: string, packet: var PsycPacket): tuple[complete: bool, @@ -84,7 +92,8 @@ proc parseModifierName(input: string, packet.cursor.inc() if result.op == '?': if input[packet.cursor] != '\n': - raise new(ValueError) # '?' must be on a line by itself + raise newException(PsycSyntaxError, + $packet.state & " has invalid operator '?'") result.complete = true return (result.complete, result.name) = parseKeyword(input, packet) @@ -96,7 +105,7 @@ proc parseModifierName(input: string, (result.complete, packet.remainingPartLen) = parseModifierValueLength(input, packet) elif input[packet.cursor - 1] != '\t': - raise new(ValueError) # invalid separator + raise newException(PsycSyntaxError, $packet.state & " has invalid separator") proc parseMethod(input: string, packet: var PsycPacket): tuple[complete: bool, value: string] = @@ -126,7 +135,8 @@ proc parseModifierValue(input: string, if result.complete: result.value = input[packet.cursor .. packet.cursor + packet.remainingPartLen - 1] if input[packet.cursor + packet.remainingPartLen] != '\n': - raise new(ValueError) # missing '\n' after binary-arg + raise newException(PsycSyntaxError, + $packet.state & " is missing '\n' after binary-arg") packet.cursor += result.value.len() + 1 packet.remainingPartLen = -1 else: @@ -144,9 +154,12 @@ proc parseContentLength(input: string, if value.len() == 0: result.value = -1 else: - result.value = value.parseInt() # parseInt may throw ValueError if invalid number + try: + result.value = value.parseInt() # parseInt may throw ValueError if invalid number + except ValueError: + raise newException(PsycSyntaxError, "invalid length after " & $packet.state) if result.value < 0: - raise new(ValueError) # negative content length + raise newException(PsycSyntaxError, "invalid length after " & $packet.state) proc parseData(input: string, packet: var PsycPacket): tuple[complete: bool, value: string] =