Skip to content

Commit

Permalink
Rework io for variable length number reading
Browse files Browse the repository at this point in the history
  • Loading branch information
Luyten-Orion committed Sep 2, 2024
1 parent bb2c6d4 commit 9dca9e3
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 9 deletions.
5 changes: 4 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
name: Run Tests

on:
[push, pull_request]
pull_request:
push:
branches:
- '**'

jobs:
test:
Expand Down
2 changes: 1 addition & 1 deletion modernnet.nimble
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Package

version = "3.1.1"
version = "3.2.0"
author = "Luyten Orion"
description = "ModernNet implements a packet reading and writing system, as well as some useful tools for implementing this into your own project!"
license = "Apache-2.0"
Expand Down
21 changes: 14 additions & 7 deletions src/modernnet/io.nim
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,13 @@ type
id*: int
buf*: Buffer

func readVar*[R: int32 | int64](data: openArray[byte], pos: var int): Result[R, int] =

func readVar*[R: int32 | int64](data: openArray[byte]): Result[tuple[num: R, bytesRead: int], int] =
## Reads a VarInt or a VarLong from the given byte sequence
result = typeof(result)(isOk: false, err: 0)

var
pos = 0
res: R
position: int8
currentByte: byte
Expand Down Expand Up @@ -72,23 +74,28 @@ func readVar*[R: int32 | int64](data: openArray[byte], pos: var int): Result[R,
else:
{.error: "Deserialisation of `" & $R & "` is not implemented!".}

return typeof(result)(isOk: true, ok: res)
return typeof(result)(isOk: true, ok: (res, pos))


func readRawPacket*(data: openArray[byte]): Result[tuple[packet: RawPacket, bytesRead: int], int] =
var pos = 0
let id = data.readVar[:int32](pos)
let id = data.readVar[:int32]()

if not id.isOk:
return typeof(result)(isOk: false, err: id.err - data.len)

pos += id.ok.bytesRead

let
idPos = pos
length = data.readVar[:int32](pos)
length = data.readVar[:int32]()

if not length.isOk:
return typeof(result)(isOk: false, err: length.err - data.len)

if data.len < (pos + length.ok):
return typeof(result)(isOk: false, err: (pos + length.ok) - data.len)
pos += length.ok.bytesRead

if data.len < (pos + length.ok.num):
return typeof(result)(isOk: false, err: (pos + length.ok.num) - data.len)

return typeof(result)(isOk: true, ok: (RawPacket(id: id.ok, buf: newBuffer(data[idPos..<(pos + length.ok)])), pos + length.ok))
return typeof(result)(isOk: true, ok: (RawPacket(id: id.ok.num, buf: newBuffer(data[idPos..<(pos + length.ok.num)])), pos + length.ok.num))

0 comments on commit 9dca9e3

Please sign in to comment.