use rustest::{Duplicate, SubFixture};
pub struct Global<Source: SubFixture>(Source);
impl<Source: SubFixture> std::ops::Deref for Global<Source> {
type Target = Source::Target;
fn deref(&self) -> &Self::Target {
self.0.deref()
}
}
impl<Source: SubFixture> rustest::Fixture for Global<Source> {
type Type = Source::Type;
type Builder = GlobalBuilder<Source>;
}
pub struct GlobalBuilder<Source: SubFixture>(Source::Builder);
impl<Source: SubFixture> rustest::Duplicate for GlobalBuilder<Source> {
fn duplicate(&self) -> Self {
Self(self.0.duplicate())
}
}
impl<Source: SubFixture> rustest::TestName for GlobalBuilder<Source> {
fn name(&self) -> Option<String> {
self.0.name()
}
}
impl<Source: SubFixture> rustest::FixtureBuilder for GlobalBuilder<Source> {
type Fixt = Global<Source>;
type Type = Source::Type;
const SCOPE: rustest::FixtureScope = rustest::FixtureScope::Global;
fn setup(ctx: &mut rustest::TestContext) -> Vec<Self>
where
Self: Sized,
{
if let Some(b) = ctx.get() {
return b;
}
let builders: Vec<_> = Source::Builder::setup(ctx)
.into_iter()
.map(|b| Self(b))
.collect();
ctx.add::<Self>(builders.duplicate());
builders
}
fn build(&self) -> rustest::FixtureCreationResult<Self::Fixt>
where
Self: Sized,
{
Ok(Global(self.0.build()?))
}
}