#combinator #generator #pattern #parser-combinator #generation #text-generation #generate

generator-combinator

将组合子组合起来生成越来越复杂的模式

4个版本 (破坏性更新)

0.4.0 2022年4月17日
0.3.0 2021年6月6日
0.2.0 2021年4月14日
0.1.0 2021年1月8日

#95解析工具

MIT/Apache

47KB
1K SLoC

generator-combinator

在Rust中提供类似于解析器组合子的可组合文本生成。

您可以使用以下命令将此crate添加到Rust项目中:generator-combinator = "0.4.0"。有关docs.rs上的文档crates.io上的列表

要生成类似街道地址的输入,只需要几个组件。我们可以快速生成近10亿个可能的值,这些值可以被完全迭代或随机采样

use generator_combinator::Generator;
let space = Generator::from(' ');

// 3-5 digits for the street number. If the generated value has leading 0s, trim them out
let number = (Generator::Digit * (3, 5)).transform(|s| {
    if s.starts_with('0') {
        s.trim_start_matches('0').to_string()
    } else {
        s
    }
});


let directional = space.clone() + oneof!("N", "E", "S", "W", "NE", "SE", "SW", "NW");
let street_names = space.clone() + oneof!("Boren", "Olive", "Spring", "Cherry", "Seneca", "Yesler", "Madison", "James", "Union", "Mercer");
let street_suffixes = space.clone() + oneof!("Rd", "St", "Ave", "Blvd", "Ln", "Dr", "Way", "Ct", "Pl");

let address = number
    + directional.clone().optional() // optional pre-directional
    + street_names
    + street_suffixes
    + directional.clone().optional(); // optional post-directional

assert_eq!(address.len(), 809_190_000);

// With the 'with_rand' feature:
let addr_values = address.values();
println!("Example: {}", addr_values.random()); //Example: 344 W Yesler Way
println!("Example: {}", addr_values.random()); //Example: 702 NE Spring Ct N
println!("Example: {}", addr_values.random()); //Example: 803 SW Madison Way SE

此库为0.4.0版本 - 可能存在问题,功能可能不完整等。

已知问题 / 注意事项

  • 生成的数字包括前导零。如果需要,可以使用.transform来解决这个问题。

待办事项

  • 考虑包括Fn变体Generator
  • Generator在组合输出之前对组件字符串进行后处理(例如,删除前导零)

许可证

根据您的选择,许可协议为以下之一:

贡献

除非您明确声明,否则您提交给工作的任何贡献,根据Apache-2.0许可证定义,均应按上述方式双重许可,不得附加任何其他条款或条件。

依赖关系

~72KB