use super::*;
#[derive(Clone, Debug, Default)]
pub struct Result<M, N> {
ok_mutator: M,
err_mutator: N,
}
pub fn result<M, N>(ok_mutator: M, err_mutator: N) -> Result<M, N> {
Result {
ok_mutator,
err_mutator,
}
}
impl<M, N, T, E> Mutate<core::result::Result<T, E>> for Result<M, N>
where
M: Generate<T>,
N: Generate<E>,
{
#[inline]
fn mutation_count(
&self,
value: &core::result::Result<T, E>,
shrink: bool,
) -> core::option::Option<u32> {
match value {
Ok(x) => {
let mut count = 0u32;
count += self.ok_mutator.mutation_count(x, shrink)?;
count += !shrink as u32;
Some(count)
}
Err(e) => {
let mut count = 0u32;
count += self.err_mutator.mutation_count(e, shrink)?;
count += 1;
Some(count)
}
}
}
#[inline]
fn mutate(
&mut self,
c: &mut Candidates,
value: &mut core::result::Result<T, E>,
) -> crate::Result<()> {
match value {
Ok(x) => {
self.ok_mutator.mutate(c, x)?;
if !c.shrink() {
c.mutation(|ctx| Ok(*value = Err(self.err_mutator.generate(ctx)?)))?;
}
}
Err(e) => {
self.err_mutator.mutate(c, e)?;
c.mutation(|ctx| Ok(*value = Ok(self.ok_mutator.generate(ctx)?)))?;
}
}
Ok(())
}
}
impl<M, N, T, E> Generate<core::result::Result<T, E>> for Result<M, N>
where
M: Generate<T>,
N: Generate<E>,
{
#[inline]
fn generate(&mut self, ctx: &mut Context) -> crate::Result<core::result::Result<T, E>> {
if ctx.rng().gen_bool() {
Ok(Ok(self.ok_mutator.generate(ctx)?))
} else {
Ok(Err(self.err_mutator.generate(ctx)?))
}
}
}
impl<T, E> DefaultMutate for core::result::Result<T, E>
where
T: DefaultMutate,
T::DefaultMutate: Generate<T>,
E: DefaultMutate,
E::DefaultMutate: Generate<E>,
{
type DefaultMutate = Result<T::DefaultMutate, E::DefaultMutate>;
}