use camino::{Utf8Path, Utf8PathBuf};
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
#[cfg_attr(test, derive(test_strategy::Arbitrary))]
pub enum JunitFlakyFailStatus {
#[default]
Failure,
Success,
}
#[derive(Clone, Debug)]
pub struct JunitConfig<'cfg> {
path: Utf8PathBuf,
report_name: &'cfg str,
store_success_output: bool,
store_failure_output: bool,
flaky_fail_status: JunitFlakyFailStatus,
}
impl<'cfg> JunitConfig<'cfg> {
pub(in crate::config) fn new(
store_dir: &Utf8Path,
settings: JunitSettings<'cfg>,
) -> Option<Self> {
let path = settings.path?;
Some(Self {
path: store_dir.join(path),
report_name: settings.report_name,
store_success_output: settings.store_success_output,
store_failure_output: settings.store_failure_output,
flaky_fail_status: settings.flaky_fail_status,
})
}
pub fn path(&self) -> &Utf8Path {
&self.path
}
pub fn report_name(&self) -> &'cfg str {
self.report_name
}
pub fn store_success_output(&self) -> bool {
self.store_success_output
}
pub fn store_failure_output(&self) -> bool {
self.store_failure_output
}
pub fn flaky_fail_status(&self) -> JunitFlakyFailStatus {
self.flaky_fail_status
}
}
#[derive(Clone, Debug)]
pub(in crate::config) struct JunitSettings<'cfg> {
pub(in crate::config) path: Option<&'cfg Utf8Path>,
pub(in crate::config) report_name: &'cfg str,
pub(in crate::config) store_success_output: bool,
pub(in crate::config) store_failure_output: bool,
pub(in crate::config) flaky_fail_status: JunitFlakyFailStatus,
}
#[derive(Clone, Debug)]
pub(in crate::config) struct DefaultJunitImpl {
pub(in crate::config) path: Option<Utf8PathBuf>,
pub(in crate::config) report_name: String,
pub(in crate::config) store_success_output: bool,
pub(in crate::config) store_failure_output: bool,
pub(in crate::config) flaky_fail_status: JunitFlakyFailStatus,
}
impl DefaultJunitImpl {
pub(crate) fn for_default_profile(data: JunitImpl) -> Self {
DefaultJunitImpl {
path: data.path,
report_name: data
.report_name
.expect("junit.report present in default profile"),
store_success_output: data
.store_success_output
.expect("junit.store-success-output present in default profile"),
store_failure_output: data
.store_failure_output
.expect("junit.store-failure-output present in default profile"),
flaky_fail_status: data
.flaky_fail_status
.expect("junit.flaky-fail-status present in default profile"),
}
}
}
#[derive(Clone, Debug, Default, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(in crate::config) struct JunitImpl {
#[serde(default)]
pub(in crate::config) path: Option<Utf8PathBuf>,
#[serde(default)]
pub(in crate::config) report_name: Option<String>,
#[serde(default)]
pub(in crate::config) store_success_output: Option<bool>,
#[serde(default)]
pub(in crate::config) store_failure_output: Option<bool>,
#[serde(default)]
pub(in crate::config) flaky_fail_status: Option<JunitFlakyFailStatus>,
}