conspiracy 0.2.0

Safe, efficient configuration abstractions
Documentation
use conspiracy_macros::define_features;
use conspiracy_theories::config::RestartRequired;

define_features!(
    pub enum Features {
        #[conspiracy(restart)]
        Foo => false,
        Bar => false,
    }
);

define_features!(
    pub enum OneRequiresRestart {
        #[conspiracy(restart)]
        Foo => false,
        Bar => false,
    }
);

define_features!(
    pub enum SomeRequireRestart {
        #[conspiracy(restart)]
        Foo => false,
        Bar => false,
        #[conspiracy(restart)]
        Cow => true,
    }
);

define_features!(
    pub enum AllRequireRestart {
        #[conspiracy(restart)]
        Foo => false,
        #[conspiracy(restart)]
        Bar => false,
        #[conspiracy(restart)]
        Cow => true,
    }
);

#[test]
fn no_change_no_restart() {
    assert!(
        !OneRequiresRestartState::default().restart_required(&OneRequiresRestartState::default())
    );
    assert!(
        !SomeRequireRestartState::default().restart_required(&SomeRequireRestartState::default())
    );
    assert!(!AllRequireRestartState::default().restart_required(&AllRequireRestartState::default()));
}

#[test]
fn untracked_change_no_restart() {
    let mut other = OneRequiresRestartState::default();
    other.bar = !other.bar;
    assert!(!OneRequiresRestartState::default().restart_required(&other));

    let mut other = SomeRequireRestartState::default();
    other.bar = !other.bar;
    assert!(!SomeRequireRestartState::default().restart_required(&other));
}

#[test]
fn tracked_change_restart() {
    let mut other = OneRequiresRestartState::default();
    other.foo = !other.foo;
    assert!(OneRequiresRestartState::default().restart_required(&other));

    let mut other = SomeRequireRestartState::default();
    other.cow = !other.cow;
    assert!(SomeRequireRestartState::default().restart_required(&other));

    let mut other = SomeRequireRestartState::default();
    other.bar = !other.bar;
    assert!(!SomeRequireRestartState::default().restart_required(&other));
    other.cow = !other.cow;
    assert!(SomeRequireRestartState::default().restart_required(&other));

    let mut other = AllRequireRestartState::default();
    other.bar = !other.bar;
    other.cow = !other.cow;
    assert!(AllRequireRestartState::default().restart_required(&other));
}