vespe 0.1.2

Text as a Canvas for LLM Collaboration and Automation
Documentation
//! This module provides functionality to generate deterministic, human-readable names
//! based on an input string's hash. These names are typically used to identify agents
//! or other entities in a consistent and memorable way, without relying on UUIDs directly.
//!
//! The names are composed of a first name, a last name, and a Roman numeral, selected
//! from predefined lists. The selection process is deterministic, ensuring that the
//! same input string always produces the same generated name.
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

/// A curated list of common, multicultural first names used for generating agent identities.
///
/// These names are chosen to provide a diverse set of options for agent identification.
const FIRST_NAMES: &[&str] = &[
    "Aaliyah",
    "Aaron",
    "Adam",
    "Aisha",
    "Alex",
    "Alexander",
    "Alice",
    "Aminah",
    "Andrea",
    "Anna",
    "Antonio",
    "Anya",
    "Benjamin",
    "Bianca",
    "Carlos",
    "Catherine",
    "Chloe",
    "Chris",
    "Christian",
    "Daniel",
    "David",
    "Diana",
    "Diego",
    "Elena",
    "Elias",
    "Emily",
    "Enzo",
    "Eric",
    "Eva",
    "Fatima",
    "Felix",
    "Gabriel",
    "Gabriella",
    "George",
    "Hannah",
    "Hector",
    "Isabella",
    "Ivan",
    "Jaden",
    "James",
    "Jasmine",
    "Javier",
    "Jessica",
    "João",
    "John",
    "Joseph",
    "Julia",
    "Kai",
    "Karim",
    "Kimberly",
    "Layla",
    "Leonardo",
    "Liam",
    "Lucas",
    "Maria",
    "Mark",
    "Maya",
    "Mehmet",
    "Mia",
    "Michael",
    "Miguel",
    "Mohammed",
    "Naomi",
    "Natalia",
    "Nathan",
    "Noah",
    "Olivia",
    "Omar",
    "Patricia",
    "Pedro",
    "Penelope",
    "Priya",
    "Rachel",
    "Rafael",
    "Riley",
    "Robert",
    "Rudolf",
    "Ryan",
    "Samantha",
    "Samuel",
    "Sara",
    "Sofia",
    "Sophia",
    "Sora",
    "Stefano",
    "Talia",
    "Thomas",
    "Victor",
    "Victoria",
    "William",
    "Zoe",
    "Zara",
];

/// A curated list of common, multicultural last names used for generating agent identities.
///
/// These names are chosen to provide a diverse set of options for agent identification.
const LAST_NAMES: &[&str] = &[
    "Almeida",
    "Andersen",
    "Antonova",
    "Chen",
    "Conti",
    "Cruz",
    "Diaz",
    "Dupont",
    "Garcia",
    "Gonzalez",
    "Hernandez",
    "Ivanov",
    "Jackson",
    "Kim",
    "Lee",
    "Lopez",
    "Martinez",
    "Miller",
    "Nguyen",
    "Patel",
    "Pereira",
    "Rossi",
    "Schmidt",
    "Silva",
    "Smith",
    "Suzuki",
    "Wang",
    "Weber",
    "Williams",
    "Wong",
    "Yamamoto",
    "Zhu",
    "Ahmed",
    "Ali",
    "Costa",
    "Da Silva",
    "De Jong",
    "Dubois",
    "Fischer",
    "Gao",
    "Gupta",
    "Hoffmann",
    "Jensen",
    "Johansen",
    "Kimura",
    "Kowalski",
    "Kumar",
    "Leblanc",
    "Li",
    "Martinez",
    "Moreno",
    "Müller",
    "Novak",
    "Oliveira",
    "Peters",
    "Popov",
    "Rahman",
    "Reyes",
    "Santos",
    "Schneider",
    "Singh",
    "Sokolov",
    "Stein",
    "Taylor",
    "Tremblay",
    "Vasquez",
    "Wagner",
    "Walker",
    "Ward",
    "Washington",
    "White",
    "Wright",
    "Young",
    "Zimmerman",
    "Bauer",
    "Becker",
    "Chang",
    "Chavez",
    "Choi",
    "Chung",
    "Cohen",
    "Dinh",
    "Franco",
    "Fuentes",
    "Gallagher",
    "Gomez",
    "Graham",
    "Hansen",
    "Hart",
    "Hawkins",
    "Henderson",
    "Huang",
    "Huber",
    "Jenkins",
    "Keller",
    "Khan",
    "Kim",
    "Klein",
    "Koch",
    "Kruger",
    "Lambert",
    "Lewis",
    "Liu",
    "Long",
    "Marsh",
    "Meyer",
    "Morales",
    "Nelson",
    "Owens",
    "Park",
    "Pham",
    "Price",
    "Ramirez",
    "Reid",
    "Riley",
    "Rivera",
    "Roberts",
    "Robinson",
    "Rodriguez",
    "Romano",
    "Ruiz",
    "Russell",
    "Scott",
    "Sharp",
    "Shaw",
    "Simpson",
    "Spencer",
    "Stone",
    "Sullivan",
    "Thompson",
    "Tran",
    "Wagner",
    "Walker",
    "Ward",
    "Washington",
    "White",
    "Wright",
    "Young",
    "Zimmerman",
];

/// Generates a name (first name + last name) based on the input content using hashing.
/// Optionally adds a Roman numeral to reduce collision probability.
///
/// The selection of names and the Roman numeral is deterministic based on the input string's hash.
pub fn generate_name(content: &str) -> String {
    let mut hasher = DefaultHasher::new();
    content.hash(&mut hasher);
    let hash_value = hasher.finish();

    let first_name_index = (hash_value % FIRST_NAMES.len() as u64) as usize;
    let last_name_index =
        ((hash_value / FIRST_NAMES.len() as u64) % LAST_NAMES.len() as u64) as usize;
    let roman_numeral_index =
        ((hash_value / (FIRST_NAMES.len() * LAST_NAMES.len()) as u64) % 10) as usize; // 0-9

    let first_name = FIRST_NAMES[first_name_index];
    let last_name = LAST_NAMES[last_name_index];

    let roman_numerals = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"];
    let roman_numeral = roman_numerals[roman_numeral_index];

    let name = format!("{} {} {}", first_name, last_name, roman_numeral);

    name
}