3 个版本 (破坏性更新)
使用旧的 Rust 2015
0.3.0 | 2019年6月28日 |
---|---|
0.2.0 | 2017年5月8日 |
0.1.0 | 2017年5月4日 |
#882 in 解析器实现
每月119,443次下载
在 57 个crate中(直接使用9个) 中使用
15KB
253 行
Circular
Circular 是一个为与 nom 一起使用而设计的流抽象。它可以公开可用数据、可用空间的可变切片,并将读取数据与从缓冲区中实际消费数据分开。
lib.rs
:
Circular,一个为与 nom 一起使用的流抽象
Circular 提供了一个 Buffer
类型,该类型封装了一个具有位置和结束的 Vec<u8>
。与使用 std::io::Read
的流抽象相比,它将读取和消费阶段分开。Read
设计为在可变切片中写入数据并随着该操作从流中消费数据。
在流模式下使用时,nom 将尝试解析一个切片,然后告诉你消耗了多少数据。因此,直到解析器返回,你才知道实际使用了多少数据。Circular::Buffer
提供了一个 data()
方法,该方法提供所有当前可读数据的不可变切片,以及一个 consume()
方法来推进流的位置。`space()
` 和 `fill()
` 方法是这些方法的写入对应项。
extern crate circular;
use circular::Buffer;
use std::io::Write;
fn main() {
// allocate a new Buffer
let mut b = Buffer::with_capacity(10);
assert_eq!(b.available_data(), 0);
assert_eq!(b.available_space(), 10);
let res = b.write(&b"abcd"[..]);
assert_eq!(res.ok(), Some(4));
assert_eq!(b.available_data(), 4);
assert_eq!(b.available_space(), 6);
//the 4 bytes we wrote are immediately available and usable for parsing
assert_eq!(b.data(), &b"abcd"[..]);
// this will advance the position from 0 to 2. it does not modify the underlying Vec
b.consume(2);
assert_eq!(b.available_data(), 2);
assert_eq!(b.available_space(), 6);
assert_eq!(b.data(), &b"cd"[..]);
// shift moves the available data at the beginning of the buffer.
// the position is now 0
b.shift();
assert_eq!(b.available_data(), 2);
assert_eq!(b.available_space(), 8);
assert_eq!(b.data(), &b"cd"[..]);
}