#string #split #str #const-generics

nightly str_splitter

使用组合器 API 进行灵活的字符串拆分实验

2 个版本

0.1.1 2023 年 1 月 21 日
0.1.0 2023 年 1 月 21 日

44#const-generics

MIT 许可证

72KB
1K SLoC

此 crate 旨在防止 str 拆分 API 的组合爆炸。

爆炸来自以下组合

  • 反向 (rsplit, rsplit_once, rsplit_terminator, rsplitn)
  • 包含 (split_inclusive)
  • 终止 (split_terminator, rsplit_terminator)
  • 限制 (splitn, rsplitn)
  • 一次 (split_once, rsplit_once)

如您所见,目前缺少各种组合(不完整)

  • 包含 + 反向
  • 包含 + 限制
  • 包含 + 一次
  • 包含 + 反向 + 限制
  • 包含 + 反向 + 一次

此外,可能还需要具有右或左包含版本的。

这可能会迅速增加 str 的 API 表面,这并不理想。

相反,此 crate 实现了一种类型的构建器 API。它以两种不同的方式执行此操作

  • 使用 const 泛型参数
  • 使用结构组合器

两者都具有几乎相同的 API。使用方式如下

use str_splitter::combinators::SplitExt;
// OR
// use str_splitter::const_generics::SplitExt;

// `split`
let v: Vec<&str> = "lionXXtigerXleopard".splitter('X').collect();
assert_eq!(v, ["lion", "", "tiger", "leopard"]);

// `splitn`
let v: Vec<&str> = "Mary had a little lambda".splitter(' ').with_limit(3).collect();
assert_eq!(v, ["Mary", "had", "a little lambda"]);

// `rsplitn`
let v: Vec<&str> = "lion::tiger::leopard".splitter("::").to_reversed().with_limit(2).collect();
assert_eq!(v, ["leopard", "lion::tiger"]);

// `rsplit_terminator`
let v: Vec<&str> = "A.B.".splitter('.').to_terminated().to_reversed().collect();
assert_eq!(v, ["B", "A"]);

// `rsplit_inclusive_once` if it existed
assert_eq!("cfg=foo=bar".splitter('=').to_inclusive().to_reversed().once(), Some(("cfg=foo", "=bar")));

思路是,由现有 split 方法返回的结构体将添加库中 Splitter 拥有的各种修饰方法。

此 crate 依赖于不稳定 Pattern 特性,因此需要 nightly Rust。

无运行时依赖