use super::{LibtestReporter, RecordReporter};
use crate::{
errors::WriteEventError,
record::{RecordOpts, StoreSizes},
reporter::events::TestEvent,
};
use nextest_metadata::TestListSummary;
use std::sync::Arc;
#[derive(Default)]
pub struct StructuredReporter<'a> {
libtest: Option<LibtestReporter<'a>>,
record: Option<RecordReporter<'a>>,
}
impl<'a> StructuredReporter<'a> {
pub fn new() -> Self {
Self::default()
}
pub fn set_libtest(&mut self, libtest: LibtestReporter<'a>) -> &mut Self {
self.libtest = Some(libtest);
self
}
pub fn set_record(&mut self, record: RecordReporter<'a>) -> &mut Self {
self.record = Some(record);
self
}
pub fn write_meta(
&self,
cargo_metadata_json: Arc<String>,
test_list: TestListSummary,
opts: RecordOpts,
) {
if let Some(record) = &self.record {
record.write_meta(cargo_metadata_json, test_list, opts);
}
}
#[inline]
pub(crate) fn write_event(&mut self, event: &TestEvent<'a>) -> Result<(), WriteEventError> {
if let Some(libtest) = &mut self.libtest {
libtest.write_event(event)?;
}
if let Some(record) = &self.record {
record.write_event(event.clone());
}
Ok(())
}
pub fn finish(self) -> Option<StoreSizes> {
if let Some(record) = self.record {
match record.finish() {
Ok(sizes) => Some(sizes),
Err(error) => {
tracing::error!("error finishing run recording: {error}");
None
}
}
} else {
None
}
}
}