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

generator-combinator

Composes combinators to generate patterns of increasing complexity

4 releases (breaking)

0.4.0 Apr 17, 2022
0.3.0 Jun 6, 2021
0.2.0 Apr 14, 2021
0.1.0 Jan 8, 2021

#111 in Parser tooling

MIT/Apache

47KB
1K SLoC

generator-combinator

Provides parser-combinator-like combinable text generation in Rust.

You can add this crate to your Rust project with generator-combinator = "0.4.0". Documentation on docs.rs and crates.io listing.

To generate street address-like input, only a few components are required. We can quickly produce a range of nearly 1B possible values that can be fully iterated over or randomly sampled:

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

This library is 0.4.0 - there may be issues, functionality may be incomplete, etc.

Known issues / nota bene

  • Generated digits include leading zeros. Use .transform to address this, if desired.

TODO

  • Consider including Fn variants of Generator
  • Generator post-processing of component strings (eg, to strip leading zeros) before combining output

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~73KB