#circular-buffer #data-stream #nom #抽象 #io #消费 #解析器

circular

一个为与 nom 一起使用而设计的流抽象

3 个版本 (破坏性更新)

使用旧的 Rust 2015

0.3.0 2019年6月28日
0.2.0 2017年5月8日
0.1.0 2017年5月4日

#882 in 解析器实现

Download history 18978/week @ 2023-11-29 22153/week @ 2023-12-06 18109/week @ 2023-12-13 8294/week @ 2023-12-20 6302/week @ 2023-12-27 18464/week @ 2024-01-03 18338/week @ 2024-01-10 23768/week @ 2024-01-17 22677/week @ 2024-01-24 22500/week @ 2024-01-31 22598/week @ 2024-02-07 24486/week @ 2024-02-14 33054/week @ 2024-02-21 31330/week @ 2024-02-28 31480/week @ 2024-03-06 18276/week @ 2024-03-13

每月119,443次下载
57 个crate中(直接使用9个) 中使用

MIT 许可证

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"[..]);
}

无运行时依赖