Skip to main content

Count

Enum Count 

Source
pub enum Count {
    Fixed(u64),
    Range((u64, u64)),
}
Expand description

Represents count specifications for JGD (JSON Generator Definition) entities.

Count defines how many items should be generated for arrays, collections, or repeated elements in JGD schemas. It supports both fixed counts and dynamic ranges, allowing for flexible data generation scenarios.

§JGD Schema Usage

In JGD schemas, count specifications control the cardinality of generated data structures. They are commonly used with:

  • Array generation (how many array elements to create)
  • Entity repetition (how many instances of an entity to generate)
  • Collection sizing (dynamic sizing of data collections)

§Variants

  • Fixed(u64): Generates exactly the specified number of items
  • Range((u64, u64)): Generates a random number of items within the range (inclusive)

§Serialization Format

The enum uses #[serde(untagged)] for natural JSON representation:

  • Fixed count: 42 (just a number)
  • Range count: [5, 10] (array with min and max values)

§Examples

use jgd_rs::{Count, GetCount, GeneratorConfig};

let mut config = GeneratorConfig::new("EN", Some(42));

// Fixed count - always generates exactly 5 items
let fixed = Count::Fixed(5);
assert_eq!(fixed.count(&mut config), 5);

// Range count - generates between 1 and 10 items
let range = Count::Range((1, 10));
let result = range.count(&mut config);
assert!((1..=10).contains(&result));

§JSON Schema Examples

{
  "array": {
    "count": 5,           // Fixed count
    "element": { ... }
  }
}
{
  "array": {
    "count": [1, 10],     // Range count
    "element": { ... }
  }
}

Variants§

§

Fixed(u64)

A fixed count that always generates exactly the specified number of items.

This variant is used when you need a consistent, predictable number of generated items. The value represents the exact count to generate.

§JSON Representation

42

§Use Cases

  • Testing scenarios requiring consistent data sizes
  • Schema definitions with fixed requirements
  • Performance testing with known data volumes
§

Range((u64, u64))

A range count that generates a random number of items within the specified bounds.

The tuple contains (min, max) values where both bounds are inclusive. The actual count is randomly determined each time count() is called.

§JSON Representation

[5, 15]

§Use Cases

  • Realistic data generation with natural variation
  • Stress testing with variable load sizes
  • Simulating real-world data patterns

Trait Implementations§

Source§

impl Clone for Count

Source§

fn clone(&self) -> Count

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Count

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Count

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl GetCount for Count

Source§

fn count(&self, config: &mut GeneratorConfig) -> u64

Generates a count value based on the Count variant.

This implementation handles both fixed and range count specifications:

  • Fixed: Returns the constant value immediately
  • Range: Uses the RNG to generate a random value within the inclusive range
§Deterministic Behavior

When the GeneratorConfig is created with a seed, range-based counts will produce deterministic results, which is useful for:

  • Testing with reproducible data
  • Debugging generation issues
  • Creating consistent development datasets
§Range Semantics

Range bounds are inclusive on both ends. A range of (5, 10) can generate any value from 5 to 10, including both 5 and 10.

§Examples
use jgd_rs::{Count, GetCount, GeneratorConfig};

let mut config = GeneratorConfig::new("EN", Some(42));

// Fixed count always returns the same value
let fixed = Count::Fixed(7);
assert_eq!(fixed.count(&mut config), 7);
assert_eq!(fixed.count(&mut config), 7); // Always 7

// Range count varies within bounds
let range = Count::Range((3, 8));
for _ in 0..10 {
    let result = range.count(&mut config);
    assert!((3..=8).contains(&result));
}

Auto Trait Implementations§

§

impl Freeze for Count

§

impl RefUnwindSafe for Count

§

impl Send for Count

§

impl Sync for Count

§

impl Unpin for Count

§

impl UnsafeUnpin for Count

§

impl UnwindSafe for Count

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Fake for T

Source§

fn fake<U>(&self) -> U
where Self: FakeBase<U>,

Source§

fn fake_with_rng<U, R>(&self, rng: &mut R) -> U
where R: Rng + ?Sized, Self: FakeBase<U>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,