<p align="center">
<img src="https://i.imgur.com/5IV9vwx.png" alt="Rant Logo" height="225px" width="225px"></img>
</p>
[![Crates.io](https://img.shields.io/crates/v/rant)](https://crates.io/crates/rant)
[![Docs.rs](https://docs.rs/rant/badge.svg)](https://docs.rs/rant)
[![Discord](https://img.shields.io/discord/332251452334669834?color=6C8BD5&label=discord&logo=discord&logoColor=%23fff)](https://discord.gg/5n7bnAD)
**Rant** is a high-level language for **procedural templating**, providing a powerful toolset for easily creating code templates, dynamic game dialogue, stories, name generators, test data, and much more.
***
## WARNING:
**This project is in alpha. Expect to see broken/missing features.**
**While I encourage you to try it out and give feedback, please do not use in production environments until a stable version is released.**
**Features may appear or disappear at any time for any reason. Assume that every alpha release will be breaking.**
***
## Introducing Rant 4
Rant 4 is a complete redesign and reimplementation from the ground up, written in Rust.
It's designed around the needs of everyone-- programmers, writers, and everyone in-between!
### Intuitive syntax
Rant is basically the opposite of [Regex](https://en.wikipedia.org/wiki/Regular_expression):
just as a regular expression compares inputs to a pattern, Rant generates matching outputs from a pattern!
Consider this regex:
```regex
# Matching inputs:
# - "Hey world!"
# - "Hi world!"
# - "Hello world!"
The Rant equivalent is nearly identical:
```rant
# Possible outputs:
# - "Hey world!"
# - "Hi world!"
# - "Hello world!"
```
## Features
* **Pain-Free API:** Rant's API is designed to be as straightforward as possible. Integrating Rant into your project only takes a few lines of code!
* **Rant Standard Library:** Rant's comprehensive standard library lets you get more done and iterate rapidly with far less boilerplate than other languages.
* **Branching on Steroids:** Diversify your output with a multitude of branch selection modes, including several built-in randomization modes.
* **Dynamic Variable System:** Inspired by other popular languages, Rant's built-in primitive and collection types let you represent whatever data you need.
* **Automatic Formatting:** Passively format text output with automatic capitalization, whitespace normalization, and number formatting.
* **Entanglement:** Synchronize RNG behavior in different parts of your program with a single function call.
* **Modules:** Create libraries of Rant functions to easily share between your programs.
* **Fully Cross-Platform:** Rant code is fully portable. Write once and run on any supported platform!
## Getting started
### CLI
Rant comes with a CLI tool that includes a REPL. You can install and run it with:
```sh
$ cargo install rant --version=4.0.0-alpha.13 --all-features
$ rant
```
### Library
Add Rant to your `Cargo.toml`:
```toml
[dependencies]
rant = "*"
```
You can run a Rant program with just a few lines of code:
```rust
use rant::Rant;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// Create a default Rant context
let mut rant = Rant::new();
// Compile a simple program
let program = rant.compile_quiet(r#"
[$greet:name] {
{Hello|Hi|Hey} <name>!
}
[greet:world]
"#)?;
// Run the program and print the output
let output = rant.run(&program)?;
println!("{}", output);
Ok(())
}
```
## Documentation
The latest reference documentation can be found at **[docs.rant-lang.org](https://docs.rant-lang.org)**.
Since Rant 4 is early in development, some documentation may be outdated/incomplete, but it is actively updated to ensure that it reflects current features with reasonable accuracy.
## [Changelog](https://github.com/rant-lang/rant/blob/master/CHANGELOG.md)
The changelog is updated constantly throughout the development process, providing a complete summary of upcoming changes at a glance even before the next release.
## License
Rant is distributed under the GNU Affero General Public License v3. See [LICENSE](./LICENSE) for more details.
An alternative, commercial license is planned for the future.