4个版本 (1个稳定版本)
1.0.0 | 2022年6月28日 |
---|---|
0.1.2 | 2022年6月28日 |
0.1.1 | 2022年6月27日 |
0.1.0 | 2022年6月27日 |
#1290 in 数据库接口
21KB
312 行
RESP解析器和验证器
一个以边缘性能为目标的RESP(REdis Serialization Protocol)解析器实现。
如果你不熟悉RESP,请从RESP规范开始了解。RESP是一种二进制安全的序列化协议。最初是为ReDiS项目开发的,它具有注入安全性(无需转义)并且解析速度快,因为它不需要回溯。
这个crate旨在解析和验证你的RESP字符串。由于该协议可以超出其初始范围,用于通用通信方案。
为此,它重用了Rust的TryInto
trait来尝试将你的&str
解析为有效的RESP。它在RESP标记的Value
枚举上实现,并返回一个Rust的Result<Value, Error>
。
使用方法
将依赖项添加到你的项目中
; Cargo.toml
[dependecies]
squall_dot_io_resp = "0.1.2"
以下是示例代码
use squall_dot_io_resp::{
Node::{self, NIL, SIZE, ARRAY, ERROR, INTEGER, UNKNOWN, SIMPLE_STRING, BULK_STRING},
Value::{self, Nil, Error, Array, String, Integer},
Error as VError,
ValueResult,
};
assert_eq!( // Empty RESP
"".try_into() as ValueResult,
Err(VError::Unexpected {node: UNKNOWN, index: 0}));
assert_eq!( // Unterminated number: missing "\r\n"
":0".try_into() as ValueResult,
Err(VError::Unexpected {node: INTEGER, index: 2}));
assert_eq!( // Not enough elements in the array
"*2\r\n$-1\r\n".try_into() as ValueResult,
Err(VError::Size {node: ARRAY, index: 9}));
assert_eq!( // Longer bulk string: got more that 2-bytes
"$2\r\nHello\r\n".try_into() as ValueResult,
Err(VError::Size {node: BULK_STRING, index: 6}));
assert_eq!( // Sorter bulk string: shorter by 1-byte (capital A acute is 2-bytes)
"$3\r\nÂ\r\n".try_into() as ValueResult,
Err(VError::Size {node: BULK_STRING, index: 7}));
use squall_dot_io_resp::{
Node::{self, NIL, SIZE, ARRAY, ERROR, INTEGER, UNKNOWN, SIMPLE_STRING, BULK_STRING},
Value::{self, Nil, Error, Array, String, Integer},
Error as VError,
ValueResult,
};
// JSON: null
assert_eq!(
Value::try_from("$-1\r\n"),
Ok(Nil)
);
// JSON: 10
assert_eq!(
Value::try_from(":10\r\n"),
Ok(Integer(10))
);
// JSON: "Nina Simone"
assert_eq!(
Value::try_from("+Nina Simone\r\n"),
Ok(String("Nina Simone".into()))
);
// JSON: "Lorem ipsum...\r\nDolor sit amet..."
assert_eq!(
Value::try_from("$33\r\nLorem ipsum...\r\nDolor sit amet...\r\n"),
Ok(String("Lorem ipsum...\r\nDolor sit amet...".into()))
);
// JavaScript: [null, 447, new Error("Oh oh!"), "Hourly", "Si vis pacem,\r\npara bellum"]
assert_eq!(
Value::try_from("*5\r\n$-1\r\n:447\r\n-Oh oh!\r\n+Hourly\r\n$26\r\nSi vis pacem,\r\npara bellum\r\n"),
Ok(Array(vec![
Nil,
Integer(447),
Error("Oh oh!".into()),
String("Hourly".into()),
String("Si vis pacem,\r\npara bellum".into())
]))
);
// NOTE: Even recursive arrays - we leave that for you to try out.
许可证
MIT
贡献
如果你发现了一些问题,请在GitHub项目上报告,或者考虑打开一个pull-request。