-
Notifications
You must be signed in to change notification settings - Fork 0
/
protocol.v
74 lines (65 loc) · 1.34 KB
/
protocol.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
module vredis
pub struct Protocol {
mut:
client &Redis = unsafe { nil }
}
fn new_protocol(client &Redis) &Protocol {
return &Protocol{
client: unsafe { client }
}
}
fn (mut p Protocol) read_reply(is_sub ...bool) ![]u8 {
mut data := p.client.socket.read_line().bytes()
if data.len == 0 {
return error('Unable to read reply content')
}
if p.client.debug {
println('<- ${data.bytestr()}')
}
if is_sub.len == 0 || !is_sub[0] {
data.delete_last()
data.delete_last()
}
match data[0..1].bytestr() {
'-' { // error
return error(data[1..].bytestr())
}
'+', ':' { // simple string
return data[1..]
}
'$' { // multi string
if data.len == 3 && data.bytestr() == '$-1' {
return '(nil)'.bytes()
}
mut multi_str_len := data[1..].bytestr().int()
mut byts := []u8{cap: multi_str_len}
// 读取接下来的字节数,需要等于本次返回长度
for multi_str_len > byts.len {
byts << p.read_reply(true)!
}
// EOF
if multi_str_len >= 2 {
byts.delete_last()
byts.delete_last()
}
return byts
}
'*' { // array
line_num := data[1..].bytestr().int()
if line_num == -1 {
return '(nil)'.bytes()
}
data.clear()
for i := 0; i < line_num; i++ {
if i > 0 {
data << crlf.bytes()
}
data << p.read_reply()!
}
return data
}
else {
return data
}
}
}