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
75
76
77
use serde::{Deserialize, Serialize};
use std::collections::VecDeque;
pub type Key = Vec<u8>;
pub type Arguments = VecDeque<Value>;
pub type ExecResult = Result<Value, String>;
#[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq)]
pub enum Value {
Nill,
Ok,
Bool(bool),
Integer(i64),
Float(u64),
Buffer(Vec<u8>),
Array(VecDeque<Value>),
Error(String),
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct Command {
pub command: String,
pub arguments: Arguments,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct CommandResult {
pub results: Value,
}
impl std::fmt::Display for Value {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Value::Nill => write!(f, "nill"),
Value::Ok => write!(f, "ok"),
Value::Bool(false) => write!(f, "false"),
Value::Bool(true) => write!(f, "true"),
Value::Integer(i) => write!(f, "{}", i),
Value::Float(i) => write!(f, "{}", f64::from_bits(*i)),
Value::Buffer(v) => write!(f, "{:?}", v),
Value::Array(v) => write!(f, "{:?}", v),
Value::Error(m) => write!(f, "{}", m),
}
}
}
impl std::fmt::Display for Command {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let args =
self
.arguments
.iter()
.map(|arg|format!("{}", arg))
.collect::<Vec<String>>()
.join(",")
;
write!(f, "{}: [{}]", self.command, args)
}
}