Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package dev.hylfrd.farmhelper.feature.lifecycle;

/** Whether detector evidence is admissible while a feature is active. */
public enum FeatureFailsafePolicy {
ALLOW_CHECKS,
SUPPRESS_CHECKS
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package dev.hylfrd.farmhelper.feature.lifecycle;

import dev.hylfrd.farmhelper.failsafe.FailsafeArbitrator;
import dev.hylfrd.farmhelper.failsafe.FailsafeCandidate;

import java.util.List;
import java.util.Objects;
import java.util.Optional;

/** Explicit result of applying feature policy before domain failsafe arbitration. */
public record FeatureFailsafeSubmission(
Status status,
FailsafeCandidate candidate,
List<FeatureId> suppressors,
Optional<FailsafeArbitrator.Submission> arbitration
) {
public enum Status {
INACTIVE,
SUPPRESSED,
ARBITRATED
}

public FeatureFailsafeSubmission {
Objects.requireNonNull(status, "status");
Objects.requireNonNull(candidate, "candidate");
suppressors = List.copyOf(Objects.requireNonNull(suppressors, "suppressors"));
Objects.requireNonNull(arbitration, "arbitration");
if (status == Status.SUPPRESSED && suppressors.isEmpty()) {
throw new IllegalArgumentException("suppressed submission requires a suppressor");
}
if (status != Status.SUPPRESSED && !suppressors.isEmpty()) {
throw new IllegalArgumentException("only a suppressed submission may name suppressors");
}
if ((status == Status.ARBITRATED) != arbitration.isPresent()) {
throw new IllegalArgumentException("only an arbitrated submission may carry arbitration");
}
}

public boolean accepted() {
return arbitration.map(FailsafeArbitrator.Submission::accepted).orElse(false);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package dev.hylfrd.farmhelper.feature.lifecycle;

import java.util.Objects;

/** Stable, human-readable identity for one registered feature. */
public record FeatureId(String value) {
public FeatureId {
Objects.requireNonNull(value, "value");
value = value.trim();
if (value.isEmpty()) {
throw new IllegalArgumentException("feature id must not be blank");
}
}

@Override
public String toString() {
return value;
}
}
Loading
Loading