#resp #parser #edge #mind #performance #error #array

io_resp

以边缘性能为目标的 RESP 解析器实现

1 个稳定版本

1.0.0 2022 年 6 月 28 日

#2445 in Rust 模式

MIT 许可证

22KB
312

RESP 解析器和验证器

v1.0.0 开始,该软件包以 io_resp 的形式发布,不再使用 squall_dot_io_resp.

一个以边缘性能为目标的 RESP (REDis Serialization Protocol) 解析器实现。

如果您不熟悉 RESP,请从这里开始了解 RESP 规范。RESP 是一种二进制安全的序列化协议。最初是为 ReDiS 项目开发的,它是注入安全的(无需转义)并且因为它在解析时不需要回溯,所以可以快速前进。

这个软件包旨在解析和验证您的 RESP 字符串。由于该协议可以用作其初始范围之外,作为一个通用通信方案。

为了做到这一点,它重用了 Rust TryInto 特性来尝试将您的 &str 解析为有效的 RESP。它实现在一个 Value 枚举的 RESP 令牌上,并返回一个 Rust Result<Value, Error>

用法

将依赖项添加到您的项目中

; Cargo.toml
[dependecies]
io_resp = "0.1.2"

以下是示例代码

use 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 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

没有运行时依赖