1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2016年9月19日 |
---|
#25 在 #cql
1KB
CQL协议
为Rust实现的CQL二进制协议的底层实现。
提供用于序列化和解析CQL实现用于通信的请求和响应消息的方法。
通常向服务器发送消息的方式可能是...
let startup = cql::requests::Startup {
cqlversion: cql::types::CqlVersion::V_3_0_0,
compression: cql::types::Compression::LZ4,
}
let mut body_buf = Vec::new();
let length = startup.serialize(&mut buf).unwrap();
let frame = cql::frame::Frame {
version: cql::frame::Version::RequestV3,
flags: cql::frame::flags::None,
stream: 0,
opcode: cql::frame::OpCode::Startup,
length: length
};
let mut header_buf = Vec::new();
frame.serialize(&mut header_buf);
socket.write(header_buf);
socket.write(body_buf);
接收消息的工作方式类似,但你需要构建一个缓冲区,直到整个解析工作完成。所需长度已给出。每个帧头为9字节,必须先解码。消息长度在帧头中给出。
match cql::response::Response::parse(input_buf) {
Err(err) => panic!(err), // do something smart here
Ok(result) => {
// result is a ParseResult and must be used to determine what is needed
match result {
Complete { message: message, consumed: consumed } => {
println!("got message {:?}, consumed {}", message, consumed);
},
Incomplete { required_size: Some(required) } => {
println!("buffer does not contain enough of the message, parsing knows it needs {} bytes", n);
},
Incomplete { required_size: None } => {
println!("buffer needs unknown more bytes, but keep feeding!");
}
}
}
}