🚧 Add additional states to state
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 23 Apr 2026 17:38:02 +0000 (19:38 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 23 Apr 2026 17:38:02 +0000 (19:38 +0200)
src/main/java/net/pterodactylus/rhynodge/State.java
src/main/java/net/pterodactylus/rhynodge/states/AbstractState.java
src/test/kotlin/net/pterodactylus/rhynodge/states/AbstractStateTest.kt

index b7e5739..6757d11 100644 (file)
 
 package net.pterodactylus.rhynodge;
 
+import java.util.List;
 import net.pterodactylus.rhynodge.output.Output;
 import org.jspecify.annotations.Nullable;
 
+import static java.util.Collections.emptyList;
+
 /**
  * Defines the current state of a system.
  *
@@ -97,4 +100,8 @@ public interface State {
 
        Output output(Reaction reaction);
 
+       default List<State> getAdditionalStates() {
+               return emptyList();
+       }
+
 }
index 87cade6..384a3b8 100644 (file)
@@ -18,6 +18,8 @@
 package net.pterodactylus.rhynodge.states;
 
 import java.time.Clock;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 
 import kotlinx.html.DIV;
@@ -55,6 +57,9 @@ public abstract class AbstractState implements State {
        /** The optional exception that occured while retrieving the state. */
        private final @Nullable Throwable exception;
 
+       /** Additional states. */
+       private final List<State> additionalStates = new ArrayList<>();
+
        /** The number of consecutive failures. */
        @JsonProperty
        private int failCount;
@@ -211,6 +216,15 @@ public abstract class AbstractState implements State {
                                .addText("text/html", htmlText());
        }
 
+       public void addState(State state) {
+               additionalStates.add(state);
+       }
+
+       @Override
+       public List<State> getAdditionalStates() {
+               return additionalStates;
+       }
+
        protected String summary(Reaction reaction) {
                return reaction.name();
        }
index 8913170..9947f73 100644 (file)
@@ -6,6 +6,10 @@ import org.junit.jupiter.api.Test
 import java.time.Clock
 import java.time.Instant.now
 import java.time.ZoneOffset.UTC
+import net.pterodactylus.util.test.containsNode
+import org.hamcrest.Matchers
+import org.hamcrest.Matchers.contains
+import org.hamcrest.Matchers.instanceOf
 
 /**
  * Unit test for [AbstractState].
@@ -86,6 +90,15 @@ class AbstractStateTest {
                assertThat(state.htmlText(), equalTo("a &amp; b"))
        }
 
+       @Test
+       fun `state can store additional states`() {
+               val state = object : AbstractState() {
+                       override fun plainText() = "test"
+               }
+               state.addState(FailedState())
+               assertThat(state.additionalStates, contains(instanceOf(FailedState::class.java)))
+       }
+
 }
 
 private val testClock = Clock.fixed(now(), UTC)