3个稳定版本

使用旧Rust 2015

2.0.0 2024年1月31日
1.0.1 2024年1月30日

#600解析器实现 中排名

Download history 71/week @ 2024-04-10 15/week @ 2024-04-17 51/week @ 2024-04-24 61/week @ 2024-05-01 14/week @ 2024-05-08 98/week @ 2024-05-15 112/week @ 2024-05-22 119/week @ 2024-05-29 106/week @ 2024-06-05 103/week @ 2024-06-12 173/week @ 2024-06-19 200/week @ 2024-06-26 178/week @ 2024-07-03 227/week @ 2024-07-10 293/week @ 2024-07-17 218/week @ 2024-07-24

972 每月下载量
用于 6crate (直接使用3个)

MIT 许可证

12KB
203 代码行

oval

(oval是circular的一个分支,合并了几个PR)

oval是为与nom一起使用而设计的流抽象。它可以公开可用的数据、可变的数据空间的一部分,并将读取数据与从缓冲区中实际消耗数据分离开。


lib.rs:

oval,为nom设计的流抽象

oval提供了一个包裹了具有位置和结束的Vec<u8>的Buffer类型。与使用std::io::Read的流抽象相比,它将读取和消费阶段分离。`Read`被设计为在可变切片中写入数据并从流中消耗它。

在流模式下使用时,nom会尝试解析一个切片,然后告诉你它消耗了多少。因此,直到解析器返回之前,你都不知道实际使用了多少数据。Buffer公开了一个`data()`方法,它提供一个不可变的当前可读数据的切片,以及一个`consume()`方法来移动流中的位置。`space()`和`fill()`方法是这些方法的写入对应方法。

extern crate oval;

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

依赖项

~45KB