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 |
#4 in #street
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 ofGenerator
-
Generator
post-processing of component strings (eg, to strip leading zeros) before combining output
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
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