add message parsing module
This commit is contained in:
parent
b566436ce5
commit
38cb55f46d
|
@ -0,0 +1,47 @@
|
|||
import strutils
|
||||
from net import IpAddress, parseIpAddress, Port, `$`
|
||||
|
||||
proc parseField(input: string, output: var string) =
|
||||
output = input
|
||||
|
||||
proc parseField[T: SomeUnsignedInt](input: string, output: var T) =
|
||||
let parsed = parseUInt(input)
|
||||
if parsed > T.high:
|
||||
raise newException(ValueError, "Unsigned integer out of range")
|
||||
output = parsed.T
|
||||
|
||||
proc parseField(input: string, output: var IpAddress) =
|
||||
output = parseIpAddress(input)
|
||||
|
||||
proc parseField(input: string, output: var Port) =
|
||||
var portNumber: uint16
|
||||
parseField(input, portNumber)
|
||||
output = Port(portNumber)
|
||||
|
||||
proc parseField[S, T](input: string, output: var array[S, T]) =
|
||||
let parts = input.split(",", S.high)
|
||||
if parts.len != S.high + 1:
|
||||
raise newException(ValueError, "Array has wrong length")
|
||||
for i in 0 .. S.high:
|
||||
parseField(parts[i], output[i])
|
||||
|
||||
proc parseField[T: tuple | object](input: string, output: var T) =
|
||||
var fieldCount = 0
|
||||
for _ in output.fields:
|
||||
fieldCount = fieldCount + 1
|
||||
let args = input.parseArgs(fieldCount)
|
||||
var i = 0
|
||||
for value in output.fields:
|
||||
parseField(args[i], value)
|
||||
i.inc
|
||||
|
||||
proc parseArgs*(input: string, count: int, optionalCount = 0): seq[string] =
|
||||
assert(optionalCount <= count)
|
||||
result = input.split("|", count - 1)
|
||||
if result.len < count:
|
||||
if result.len < count - optionalCount:
|
||||
raise newException(ValueError, "invalid message")
|
||||
result.add(repeat("", count - result.len))
|
||||
|
||||
proc parseMessage*[T: tuple | object](input: string): T =
|
||||
parseField(input, result)
|
Loading…
Reference in New Issue