# Rust Advanced String Generator
This project provides a powerful and flexible string generator based on regex-like patterns, with support for features such as character classes, custom repeats, array-based string selection, incremental values, and more. The application can be compiled and used both as a native Rust library and in a WebAssembly (WASM) context.
## Demo
Demo for this project below
https://igarashi.net/rust-advanced-string-generator/
## Features
- **Character Classes**: Supports `\d`, `\w`, `\s`, `\D`, `\W`, `\S`, etc.
- **Custom Repeats**: Generate strings with patterns like `\d{2,4}`.
- **Character Ranges**: Use ranges like `[a-z]`, `[A-Z]`, `[0-9]` to specify sets of characters.
- **Negation in Ranges**: Specify characters not to be included with patterns like `[^a-z]`.
- **Incremental Values**: Automatically increment values using patterns like `\i+` for ascending and `\i-` for descending.
- **Array-Based Selection**: Choose from an array of strings using patterns like `\a`, `\a+`, and `\a-`.
- **Group Capturing and Backreferences**: Capture groups of characters and reference them later in the pattern.
- **WASM Support**: Compile the project to WebAssembly and use it in a web environment.
## Installation
1. **Clone the repository**:
```sh
git clone https://github.com/your-repo/regex_generator.git
```
2. **Navigate to the project directory**:
```sh
cd regex_generator
```
3. **Build the project**:
```sh
cargo build --release
```
### For WebAssembly
1. Ensure you have `wasm-pack` installed:
```sh
cargo install wasm-pack
```
2. Build the project targeting WebAssembly:
```sh
wasm-pack build --target web --features wasm
```
3. Use the generated WebAssembly module in your web project.
## Usage
```sh
regex_generator [OPTIONS] PATTERN [INCREMENT] [ARRAY]
```
### Examples
1. **Generate a string with an incrementing value with leading zeros**:
```sh
./target/release/regex_generator -p '\\i{:10}' -i 43
```
2. **Generate a random string from an array**:
```sh
./target/release/regex_generator -p '[A-Za-z]{5}' -a 'apple,banana,grape'
```
3. **Use a combination of patterns**:
```sh
./target/release/regex_generator -p '\\w{3}-\\d{2:5}-\\i{:6}' -i 100 -a 'cat,dog,mouse'
```
### WASM Example
```javascript
import init, { WasmRegexGenerator } from './pkg/regex_generator_wasm.js';
async function run() {
await init();
const generator = new WasmRegexGenerator("\\i+\\d\\d", "1299", ["apple", "banana", "cherry"]);
console.log(generator.generate()); // Outputs: 1300
console.log(generator.generate()); // Outputs: 1301
}
run();
```
### Options
| `-h`, `--help` | Prints help information |
| `-v`, `--version` | Prints version information |
| `-p`, `--pattern` | Specifies the pattern to use |
| `-i`, `--increment` | Initial value for the increment (optional) |
| `-a`, `--array` | Array of strings (comma-separated) for `/a` pattern (optional) |
## Supported Patterns
| `\d` | Any digit from `0` to `9`. | `\d\d` | `42`, `07` |
| `\w` | Any "word" character: letters, digits, and underscores. | `\w\w\w` | `abc`, `1X_` |
| `\s` | Any whitespace character (space, tab, newline). | `\s\s` | ` `, `\t ` |
| `\D` | Any non-digit character. | `\D\D` | `AB`, `--` |
| `\W` | Any non-word character. | `\W\W` | `**`, `@#` |
| `\S` | Any non-whitespace character. | `\S\S\S` | `abc`, `a1b` |
| `{n,m}` | Insert between `n` and `m` times. | `\d{2,4}` | `12`, `4321` |
| `[abc]` | Insert any one of the characters `a`, `b`, or `c`. | `[abc]{3}` | `abc`, `cab` |
| `[^abc]` | Insert any character except `a`, `b`, or `c`. | `[^abc]{3}` | `xyz`, `123` |
| `[a-z]` | Insert any character in the range from `a` to `z`. | `[a-z]{3}` | `abc`, `xyz` |
| `[0-9]{n:z}` | Insert any number in the range from `0` to `9`, `n` times with `z` of leading zero. | `[0-9]{3:5}` | `00827`, `00281` |
| `\i` or `\i+` | Insert an incrementing value, starting from the specified value and increasing with each use. | `\i+\d\d` | `1300`, `1301` |
| `\i-` | Insert a decrementing value, starting from the specified value and decreasing with each use. | `\i-\d\d` | `1299`, `1298` |
| `\i{:z}` | Insert a incrementing value, starting from the specified value and leading zero. | `\i{:6}` | `001299`, `001298` |
| `\a` | Insert a random string from an array of values. | `\a` | `apple`, `banana` |
| `\a+` | Insert a string from an array in ascending order. | `\a+` | `apple`, `banana` |
| `\a-` | Insert a string from an array in descending order. | `\a-` | `cherry`, `banana` |
| `()` | Group characters. | `(\d\d)` | `42` |
| `\1` | Backreference to the first captured group. | `(\d\d)\1` | `4242` |
| `|` | Alternation; insert either the expression before or the expression after. | `a|b` | `a`, `b` |
## Testing
### Native Rust
To run the tests in a native Rust environment, execute:
```sh
cargo test
```
### WebAssembly
To build and test the WebAssembly version, follow these steps:
1. Build the WASM module:
```sh
wasm-pack build --target web --features wasm
```
2. Create an HTML file to load and test the WASM module.
3. Serve the HTML file locally using a server like Python's `http.server`:
```sh
python3 -m http.server
```
## Help
To get help information, run:
```sh
./target/release/regex_generator -h
```
## Version
To check the version of the tool, run:
```sh
./target/release/regex_generator -v
```
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
## Contributing
Contributions are welcome! Please submit a pull request or create an issue to report bugs or suggest features.