#random #enums #derive #struct

enum-derived

Generate random instances of your enums and structs

24 releases

0.9.2 Mar 4, 2025
0.8.2 Mar 7, 2023

#328 in Rust patterns

Download history 404/week @ 2024-12-12 215/week @ 2024-12-19 44/week @ 2024-12-26 665/week @ 2025-01-02 644/week @ 2025-01-09 681/week @ 2025-01-16 799/week @ 2025-01-23 755/week @ 2025-01-30 575/week @ 2025-02-06 456/week @ 2025-02-13 705/week @ 2025-02-20 1002/week @ 2025-02-27 840/week @ 2025-03-06 844/week @ 2025-03-13 858/week @ 2025-03-20 772/week @ 2025-03-27

3,463 downloads per month

MIT license

12KB
167 lines

Enum-Derived

Use enum-derived's Rand macro to generate random variants of your enums and structs. All fields are populated with independent random values.

Need custom constraints applied to a variant or field? Use the #[custom_rand(your_function)] attribute to override the default behavior or extend support to types without default support.

Need some variants to be generated more ofter? Use the #[weight(VARIANT_WEIGHT)] to change the distribution.

crates.io Build


Rand

Rand allows for a random variant of an enum, or struct, to be generated.

The [rand] crate's rand::random method is used for the default implementation of [Rand]. Unsupported variants can us the #[custom_rand(your_function)] to extend the functionality.

Note

Support for String, Vec, HashMap<K, V>, and HashSet has been added. The implementation for String and Vec will create an instance with a lenght between 1 and 64 elements. The implementation for HashMap and HashSet will create an instance with 1 to 16 elements.

Example

use rand::{thread_rng, Rng};
use enum_derived::Rand;

#[derive(Rand)]
struct Weather {
    wind_speed: u8,
    #[custom_rand(rand_temp)]
    temperature: f32,
    cloudy: bool,
    location: String,
}

#[derive(Rand)]
enum TravelLogEntry {
    Airplane {
        weather: Weather,
        altitude: u16
    },
    Boat(
        Weather,
        #[custom_rand(rand_boat_speed)]
        u32,
    ),
    #[custom_rand(always_has_sunroof)]
    Car {
        has_sunroof: bool,
    },
    #[weight(3)]
    SpaceShip,
}

#[derive(Rand)]
pub struct TravelLog(Vec<TravelLogEntry>);

fn sample_rand_call() {
    let travel_log = TravelLog::rand();
}

fn always_has_sunroof() -> TravelLogEntry {
    TravelLogEntry::Car { has_sunroof: true }
}

fn rand_boat_speed() -> u32 {
    thread_rng().gen_range(5..50)
}

fn rand_temp() -> f32 {
   thread_rng().gen_range(-20.0..120.0)
}

Dependencies

~2MB
~43K SLoC