An open API service indexing awesome lists of open source software.

https://github.com/folkengine/random_name_generator_rs

A Random Name Generator in Rust. Currently supports Demonic, Elvish, Fantasy, Goblin and Roman.
https://github.com/folkengine/random_name_generator_rs

language rust rust-lang rust-library

Last synced: 4 months ago
JSON representation

A Random Name Generator in Rust. Currently supports Demonic, Elvish, Fantasy, Goblin and Roman.

Awesome Lists containing this project

README

          

# random_name_generator

[![Crates.io](https://img.shields.io/crates/v/random_name_generator?style=flat-square)](https://crates.io/crates/random_name_generator)
[![Crates.io](https://img.shields.io/crates/d/random_name_generator?style=flat-square)](https://crates.io/crates/random_name_generator)
[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
[![Build and Test](https://github.com/folkengine/random_name_generator_rs/actions/workflows/CI.yaml/badge.svg)](https://github.com/folkengine/random_name_generator_rs/actions/workflows/CI.yaml)

This is a rust port of the [Ruby port](https://github.com/folkengine/random_name_generator)
of the [Java Random Name Generator library](https://github.com/folkengine/java-random-name-generator).

It generates it's results based upon which [language file](src/languages) is specified.
Currently, the following are supported in both English and Russian:

* Demonic - New! Syllables based on [the infernal names](https://en.wikipedia.org/wiki/The_infernal_names) and [theological demons](https://en.wikipedia.org/wiki/List_of_theological_demons)
* Elven
* Fantasy
* Goblin
* Roman

_Thanks to [Zhumatiy Sergey](https://github.com/zhum), for his contribution of the Russian language
files, originally in the [Ruby version](https://github.com/folkengine/random_name_generator) of this library!_

The following are in progress:

* Curse
* [profane-words](https://github.com/zacanger/profane-words) looks like a good resource

## Using the library

```rust
use rnglib::{RNG, Language};

fn main() {
let rng = RNG::try_from(&Language::Elven).unwrap();

let first_name = rng.generate_name();
let last_name = rng.generate_name();

println!("{}: {} {}", rng.name, first_name, last_name)
}
```

It is possible to control the number of syllables for a generated name:

```rust
use rnglib::{RNG, Language};

fn main() {
let rng = RNG::try_from(&Language::Fantasy).unwrap();
let name = rng.generate_name_by_count(3);
println!("{}: {}", rng.name, name)
}
```

One can also pass in custom language files:

```
use rnglib::{RNG};

fn main() {
let rng = RNG::new_from_file("src/languages/Test-tiny.txt").unwrap();
let name = rng.generate_name();
println!("{}: {}", rng.name, name)
}
```

## Running the binary

To get information about the available options, run help.

Using cargo:

```
$> cargo run -- --help
Random Name Generator

Usage: rng [OPTIONS]

Options:
-d, --demonic
-e, --elven
-f, --fantasy
-g, --goblin
-r, --roman
-c, --curse [UNDER CONSTRUCTION]
-x, --flipmode Flipmode is the greatest! (Random language)
--russian Use Russian language file, if available
--short Creates shorter names
--raw Reads in a raw language file
-n, --number Number of names created. [default: 2]
-h, --help Print help
-V, --version Print version
```

or from the binary:

```
$> rng --help
```

Passing in one of the language flags will generate a name using that Language's source file.

From cargo:

```
$> cargo run -- -g
Goblin: zradogul bargodul
```

It also now supports Russian language files:

```
❯ cargo run -- --roman --russian
Римский: Дафрибуцио Дубенус

❯ cargo run -- --goblin --russian
Гоблин: Краог Зрашагул

❯ cargo run -- --fantasy --russian
Фантазия: Валорнен Гарлакот

❯ cargo run -- --elven --russian
Эльфийский: Латэнаэлмасан Шелиан
```

From the binary:

```
$> rng -e
Elven: daedar latherdre
```

## Dependencies

* [Anyhow](https://github.com/dtolnay/anyhow)
* [Bitflags](https://github.com/bitflags/bitflags)
* [Clap](https://github.com/clap-rs/clap)
* [Clippy](https://rust-lang.github.io/rust-clippy/)
* [rust-embed](https://github.com/pyros2097/rust-embed)

## Dev Dependencies

* [Criterion](https://github.com/bheisler/criterion.rs) for benchmarking
* [Getting Started](https://bheisler.github.io/criterion.rs/book/getting_started.html)
* [Proptest](https://github.com/AltSysrq/proptest) - Hypothesis-like property testing for Rust
* [Rstest](https://github.com/la10736/rstest) - Fixture-based test framework for Rust

## TODO

* Finish curse words
* Add syllable weight flag
* Add number of names flag

## Further Interest

* [Constructed Languages for Language Geeks](https://www.reddit.com/r/conlangs/)
* [Expletive infixation](https://en.wikipedia.org/wiki/Expletive_infixation)
* [Phonotactics](https://en.wikipedia.org/wiki/Phonotactics)
* [Stanley Unwin](https://en.wikipedia.org/wiki/Stanley_Unwin_(comedian))
* [Vulgar's Atlas](https://www.vulgarlang.com/atlas/)