use std::collections::HashMap;
use serde_json::{Number, Value};
use crate::generators::{self as gs, BoxedGenerator, DefaultGenerator, Generator};
pub struct NumberGenerator {
inner: BoxedGenerator<'static, Number>,
}
impl Generator<Number> for NumberGenerator {
fn do_draw(&self, tc: &crate::TestCase) -> Number {
self.inner.do_draw(tc)
}
fn as_basic(&self) -> Option<gs::BasicGenerator<'_, Number>> {
self.inner.as_basic()
}
}
pub fn numbers() -> NumberGenerator {
let inner = gs::one_of([
gs::integers::<i64>().map(Number::from).boxed(),
gs::integers::<u64>().map(Number::from).boxed(),
gs::floats::<f64>()
.allow_nan(false)
.allow_infinity(false)
.map(|f| Number::from_f64(f).unwrap())
.boxed(),
])
.boxed();
NumberGenerator { inner }
}
pub struct ValueGenerator {
inner: BoxedGenerator<'static, Value>,
}
impl Generator<Value> for ValueGenerator {
fn do_draw(&self, tc: &crate::TestCase) -> Value {
self.inner.do_draw(tc)
}
}
pub fn values() -> ValueGenerator {
let def = gs::deferred::<Value>();
let handle = def.generator();
let recursive = gs::one_of([
gs::just(Value::Null).boxed(),
gs::booleans().map(Value::Bool).boxed(),
numbers().map(Value::Number).boxed(),
<String as DefaultGenerator>::default_generator()
.map(Value::String)
.boxed(),
gs::vecs(handle.clone()).map(Value::Array).boxed(),
gs::hashmaps(
<String as DefaultGenerator>::default_generator(),
handle.clone(),
)
.map(|m: HashMap<String, Value>| Value::Object(m.into_iter().collect()))
.boxed(),
])
.boxed();
def.set(recursive);
ValueGenerator { inner: handle }
}
#[cfg(feature = "serde_json_raw_value")]
pub struct RawValueGenerator {
inner: BoxedGenerator<'static, Box<serde_json::value::RawValue>>,
}
#[cfg(feature = "serde_json_raw_value")]
impl Generator<Box<serde_json::value::RawValue>> for RawValueGenerator {
fn do_draw(&self, tc: &crate::TestCase) -> Box<serde_json::value::RawValue> {
self.inner.do_draw(tc)
}
}
#[cfg(feature = "serde_json_raw_value")]
pub fn raw_values() -> RawValueGenerator {
let inner = values()
.map(|v| {
serde_json::value::RawValue::from_string(serde_json::to_string(&v).unwrap()).unwrap()
})
.boxed();
RawValueGenerator { inner }
}