use std::cmp;
use futures::future;
use crate::{Event, World, Writer, cli, event, parser, writer};
#[derive(Clone, Copy, Debug)]
pub struct Tee<L, R> {
left: L,
right: R,
}
impl<L, R> Tee<L, R> {
#[must_use]
pub const fn new(left: L, right: R) -> Self {
Self { left, right }
}
}
impl<W, L, R> Writer<W> for Tee<L, R>
where
W: World,
L: Writer<W>,
R: Writer<W>,
{
type Cli = cli::Compose<L::Cli, R::Cli>;
async fn handle_event(
&mut self,
event: parser::Result<Event<event::Cucumber<W>>>,
cli: &Self::Cli,
) {
future::join(
self.left.handle_event(event.clone(), &cli.left),
self.right.handle_event(event, &cli.right),
)
.await;
}
}
#[warn(clippy::missing_trait_methods)]
impl<W, L, R, Val> writer::Arbitrary<W, Val> for Tee<L, R>
where
W: World,
L: writer::Arbitrary<W, Val>,
R: writer::Arbitrary<W, Val>,
Val: Clone,
{
async fn write(&mut self, val: Val) {
future::join(self.left.write(val.clone()), self.right.write(val)).await;
}
}
impl<W, L, R> writer::Stats<W> for Tee<L, R>
where
L: writer::Stats<W>,
R: writer::Stats<W>,
Self: Writer<W>,
{
fn passed_steps(&self) -> usize {
cmp::max(self.left.passed_steps(), self.right.passed_steps())
}
fn skipped_steps(&self) -> usize {
cmp::max(self.left.skipped_steps(), self.right.skipped_steps())
}
fn failed_steps(&self) -> usize {
cmp::max(self.left.failed_steps(), self.right.failed_steps())
}
fn retried_steps(&self) -> usize {
cmp::max(self.left.retried_steps(), self.right.retried_steps())
}
fn parsing_errors(&self) -> usize {
cmp::max(self.left.parsing_errors(), self.right.parsing_errors())
}
fn hook_errors(&self) -> usize {
cmp::max(self.left.hook_errors(), self.right.hook_errors())
}
}
#[warn(clippy::missing_trait_methods)]
impl<L, R> writer::Normalized for Tee<L, R>
where
L: writer::Normalized,
R: writer::Normalized,
{
}
#[warn(clippy::missing_trait_methods)]
impl<L, R> writer::NonTransforming for Tee<L, R>
where
L: writer::NonTransforming,
R: writer::NonTransforming,
{
}