use crate::{
AllowedCharacters, GenerateBlobsResult, GenerateDecimalFractionsResult,
GenerateGaussiansResult, GenerateIntegersResult, GenerateStringsResult, GenerateUUIDsResult,
Random, Response, Result,
};
macro_rules! builder {
($field:ident, $field_type:ty) => {
pub fn $field(mut self, $field: $field_type) -> Self {
self.$field = $field;
self
}
};
}
pub struct RequestIntegers<'a> {
client: &'a Random,
min: i32,
max: i32,
limit: u16,
replacement: bool,
}
impl<'a> RequestIntegers<'a> {
pub fn new(client: &'a Random) -> RequestIntegers {
RequestIntegers {
client,
min: 0i32,
max: 100i32,
limit: 10,
replacement: true,
}
}
builder!(min, i32);
builder!(max, i32);
builder!(limit, u16);
builder!(replacement, bool);
}
impl<'a> RequestIntegers<'a> {
pub fn collect<T: From<Response<GenerateIntegersResult>>>(self) -> Result<T> {
Ok(T::from(self.client.generate_integers(
self.min,
self.max,
self.limit,
self.replacement,
)?))
}
}
pub struct RequestDecimalFractions<'a> {
client: &'a Random,
limit: u16,
decimal_places: u8,
}
impl<'a> RequestDecimalFractions<'a> {
pub fn new(client: &'a Random) -> RequestDecimalFractions {
RequestDecimalFractions {
client,
limit: 10u16,
decimal_places: 4u8,
}
}
builder!(limit, u16);
builder!(decimal_places, u8);
}
impl<'a> RequestDecimalFractions<'a> {
pub fn collect<T: From<Response<GenerateDecimalFractionsResult>>>(self) -> Result<T> {
Ok(T::from(self.client.generate_decimal_fractions(
self.limit,
self.decimal_places,
)?))
}
}
pub struct RequestGaussians<'a> {
client: &'a Random,
limit: u16,
mean: i32,
standard_deviation: i32,
significant_digits: u8,
}
impl<'a> RequestGaussians<'a> {
pub fn new(client: &'a Random) -> RequestGaussians {
RequestGaussians {
client,
limit: 10u16,
mean: 0i32,
standard_deviation: 0i32,
significant_digits: 0u8,
}
}
builder!(limit, u16);
builder!(mean, i32);
builder!(standard_deviation, i32);
builder!(significant_digits, u8);
}
impl<'a> RequestGaussians<'a> {
pub fn collect<T: From<Response<GenerateGaussiansResult>>>(self) -> Result<T> {
Ok(T::from(self.client.generate_gaussians(
self.limit,
self.mean,
self.standard_deviation,
self.significant_digits,
)?))
}
}
pub struct RequestStrings<'a> {
client: &'a Random,
limit: u16,
length: u8,
characters: AllowedCharacters,
}
impl<'a> RequestStrings<'a> {
pub fn new(client: &'a Random) -> RequestStrings {
use std::collections::BTreeSet;
RequestStrings {
client,
limit: 10u16,
length: 0u8,
characters: AllowedCharacters("0123456789abcdef".chars().collect::<BTreeSet<char>>()),
}
}
builder!(limit, u16);
builder!(length, u8);
builder!(characters, AllowedCharacters);
}
impl<'a> RequestStrings<'a> {
pub fn collect<T: From<Response<GenerateStringsResult>>>(self) -> Result<T> {
Ok(T::from(self.client.generate_strings(
self.limit,
self.length,
self.characters,
)?))
}
}
pub struct RequestUUIDs<'a> {
client: &'a Random,
limit: u16,
}
impl<'a> RequestUUIDs<'a> {
pub fn new(client: &'a Random) -> RequestUUIDs {
RequestUUIDs {
client,
limit: 10u16,
}
}
builder!(limit, u16);
}
impl<'a> RequestUUIDs<'a> {
pub fn collect<T: From<Response<GenerateUUIDsResult>>>(self) -> Result<T> {
Ok(T::from(self.client.generate_uuids(self.limit)?))
}
}
pub struct RequestBlobs<'a> {
client: &'a Random,
limit: u16,
size: u32,
}
impl<'a> RequestBlobs<'a> {
pub fn new(client: &'a Random) -> RequestBlobs {
RequestBlobs {
client,
limit: 10u16,
size: 128u32,
}
}
builder!(limit, u16);
builder!(size, u32);
}
impl<'a> RequestBlobs<'a> {
pub fn collect<T: From<Response<GenerateBlobsResult>>>(self) -> Result<T> {
Ok(T::from(self.client.generate_blobs(self.limit, self.size)?))
}
}