This commit is contained in:
2025-01-31 15:39:44 +03:00
parent 27cb6cb0c6
commit 74ab68d05f
185 changed files with 2321 additions and 972 deletions

View File

@@ -17,138 +17,201 @@ pub fn decoder_new(data []u8) Decoder {
return e
}
pub fn (mut d Decoder) get_string() string {
n := d.get_u16()
v := d.data[..n]
pub fn (mut d Decoder) get_string() !string {
n := d.get_u16()!
if n > 64 * 1024 { // 64KB limit
return error('string length ${n} exceeds 64KB limit')
}
if n > d.data.len {
return error('string length ${n} exceeds remaining data length ${d.data.len}')
}
mut bytes := []u8{len: int(n)}
for i in 0 .. n {
bytes[i] = d.data[i]
}
d.data.delete_many(0, n)
return v.bytestr()
return bytes.bytestr()
}
pub fn (mut d Decoder) get_int() int {
return int(d.get_u32())
pub fn (mut d Decoder) get_int() !int {
return int(d.get_u32()!)
}
pub fn (mut d Decoder) get_bytes() []u8 {
n := int(d.get_u32())
v := d.data[..n]
pub fn (mut d Decoder) get_bytes() ![]u8 {
n := int(d.get_u32()!)
if n > 64 * 1024 { // 64KB limit
return error('bytes length ${n} exceeds 64KB limit')
}
if n > d.data.len {
return error('bytes length ${n} exceeds remaining data length ${d.data.len}')
}
mut bytes := []u8{len: int(n)}
for i in 0 .. n {
bytes[i] = d.data[i]
}
d.data.delete_many(0, n)
return v
return bytes
}
// adds u16 length of string in bytes + the bytes
pub fn (mut d Decoder) get_u8() u8 {
// remove first byte, this corresponds to u8, so the data bytestring becomes 1 byte shorter
pub fn (mut d Decoder) get_u8() !u8 {
if d.data.len < 1 {
return error('not enough data for u8')
}
v := d.data.first()
d.data.delete(0)
return v
}
pub fn (mut d Decoder) get_u16() u16 {
v := d.data[..2]
pub fn (mut d Decoder) get_u16() !u16 {
if d.data.len < 2 {
return error('not enough data for u16')
}
mut bytes := []u8{len: 2}
bytes[0] = d.data[0]
bytes[1] = d.data[1]
d.data.delete_many(0, 2)
return bin.little_endian_u16(v)
return bin.little_endian_u16(bytes)
}
pub fn (mut d Decoder) get_u32() u32 {
v := d.data[..4]
pub fn (mut d Decoder) get_u32() !u32 {
if d.data.len < 4 {
return error('not enough data for u32')
}
mut bytes := []u8{len: 4}
bytes[0] = d.data[0]
bytes[1] = d.data[1]
bytes[2] = d.data[2]
bytes[3] = d.data[3]
d.data.delete_many(0, 4)
return bin.little_endian_u32(v)
return bin.little_endian_u32(bytes)
}
pub fn (mut d Decoder) get_u64() u64 {
v := d.data[..8]
pub fn (mut d Decoder) get_u64() !u64 {
if d.data.len < 8 {
return error('not enough data for u64')
}
mut bytes := []u8{len: 8}
bytes[0] = d.data[0]
bytes[1] = d.data[1]
bytes[2] = d.data[2]
bytes[3] = d.data[3]
bytes[4] = d.data[4]
bytes[5] = d.data[5]
bytes[6] = d.data[6]
bytes[7] = d.data[7]
d.data.delete_many(0, 8)
return bin.little_endian_u64(v)
return bin.little_endian_u64(bytes)
}
pub fn (mut d Decoder) get_i64() i64 {
v := d.data[..8]
pub fn (mut d Decoder) get_i64() !i64 {
if d.data.len < 8 {
return error('not enough data for i64')
}
mut bytes := []u8{len: 8}
bytes[0] = d.data[0]
bytes[1] = d.data[1]
bytes[2] = d.data[2]
bytes[3] = d.data[3]
bytes[4] = d.data[4]
bytes[5] = d.data[5]
bytes[6] = d.data[6]
bytes[7] = d.data[7]
d.data.delete_many(0, 8)
return u64(bin.little_endian_u64(v))
return u64(bin.little_endian_u64(bytes))
}
pub fn (mut d Decoder) get_time() time.Time {
nano_time := d.get_i64()
pub fn (mut d Decoder) get_time() !time.Time {
nano_time := d.get_i64()!
seconds := nano_time / int(1e9)
nano_seconds := int(nano_time % int(1e9))
return time.unix_nanosecond(seconds, nano_seconds)
}
pub fn (mut d Decoder) get_ourtime() ourtime.OurTime {
pub fn (mut d Decoder) get_ourtime() !ourtime.OurTime {
return ourtime.OurTime{
unixt: d.get_i64()
unixt: d.get_i64()!
}
}
pub fn (mut d Decoder) get_list_string() []string {
n := d.get_u16()
pub fn (mut d Decoder) get_list_string() ![]string {
n := d.get_u16()!
mut v := []string{len: int(n)}
for i in 0 .. n {
v[i] = d.get_string()
v[i] = d.get_string()!
}
return v
}
pub fn (mut d Decoder) get_list_int() []int {
n := d.get_u16()
pub fn (mut d Decoder) get_list_int() ![]int {
n := d.get_u16()!
mut v := []int{len: int(n)}
for i in 0 .. n {
v[i] = d.get_int()
v[i] = d.get_int()!
}
return v
}
pub fn (mut d Decoder) get_list_u8() []u8 {
n := d.get_u16()
v := d.data[..n]
pub fn (mut d Decoder) get_list_u8() ![]u8 {
n := d.get_u16()!
if n > 64 * 1024 { // 64KB limit
return error('list length ${n} exceeds 64KB limit')
}
if n > d.data.len {
return error('list length ${n} exceeds remaining data length ${d.data.len}')
}
mut bytes := []u8{len: int(n)}
for i in 0 .. n {
bytes[i] = d.data[i]
}
d.data.delete_many(0, n)
return v
return bytes
}
pub fn (mut d Decoder) get_list_u16() []u16 {
n := d.get_u16()
pub fn (mut d Decoder) get_list_u16() ![]u16 {
n := d.get_u16()!
mut v := []u16{len: int(n)}
for i in 0 .. n {
v[i] = d.get_u16()
v[i] = d.get_u16()!
}
return v
}
pub fn (mut d Decoder) get_list_u32() []u32 {
n := d.get_u16()
pub fn (mut d Decoder) get_list_u32() ![]u32 {
n := d.get_u16()!
mut v := []u32{len: int(n)}
for i in 0 .. n {
v[i] = d.get_u32()
v[i] = d.get_u32()!
}
return v
}
pub fn (mut d Decoder) get_list_u64() []u64 {
n := d.get_u16()
pub fn (mut d Decoder) get_list_u64() ![]u64 {
n := d.get_u16()!
mut v := []u64{len: int(n)}
for i in 0 .. n {
v[i] = d.get_u64()
v[i] = d.get_u64()!
}
return v
}
pub fn (mut d Decoder) get_map_string() map[string]string {
n := d.get_u16()
pub fn (mut d Decoder) get_map_string() !map[string]string {
n := d.get_u16()!
mut v := map[string]string{}
for _ in 0 .. n {
key := d.get_string()
val := d.get_string()
key := d.get_string()!
val := d.get_string()!
v[key] = val
}
return v
}
pub fn (mut d Decoder) get_map_bytes() map[string][]u8 {
n := d.get_u16()
pub fn (mut d Decoder) get_map_bytes() !map[string][]u8 {
n := d.get_u16()!
mut v := map[string][]u8{}
for _ in 0 .. n {
key := d.get_string()
val := d.get_bytes()
key := d.get_string()!
val := d.get_bytes()!
v[key] = val
}
return v