diff --git a/api/src/main/java/net/kyori/adventure/text/JoinConfiguration.java b/api/src/main/java/net/kyori/adventure/text/JoinConfiguration.java index 41c36df383..8fd58e8d55 100644 --- a/api/src/main/java/net/kyori/adventure/text/JoinConfiguration.java +++ b/api/src/main/java/net/kyori/adventure/text/JoinConfiguration.java @@ -99,6 +99,53 @@ public interface JoinConfiguration extends Buildable + * A purely text based example of this syntax, without introducing the concepts of components, would join the two strings 'hello' and 'there' together, + * creating the following output: 'hello\nthere'. + *

+ * + * @return the join configuration. + * @since 4.10.0 + */ + static @NotNull JoinConfiguration newlines() { + return JoinConfigurationImpl.STANDARD_NEW_LINES; + } + + /** + * Provides a join configuration with no prefix or suffix that simply joins the components together using a single comma, matching a CSV like layout. + * + *

+ * A purely text based example of this syntax, without introducing the concepts of components, would join the two strings 'hello' and 'there' together, + * creating the following output: 'hello,there'. + *

+ * + * @return the join configuration. + * @since 4.10.0 + */ + static @NotNull JoinConfiguration commas() { + return JoinConfigurationImpl.STANDARD_COMMA_SEPARATED; + } + + /** + * Provides a join configuration that joins components together in the same manner {@link java.util.Arrays#toString(Object[])} stringifies an array. + * Specifically, the join configuration prefixes and suffixes the components with an open or closed square bracket respectively. + * Components themselves are joined together using a comma and a space. + * +

+ * A purely text based example of this syntax, without introducing the concepts of components, would join the two strings 'hello' and 'there' together, + * creating the following output: '[hello, there]'. + *

+ * + * @return the join configuration. + * @since 4.10.0 + */ + static @NotNull JoinConfiguration arrayLike() { + return JoinConfigurationImpl.STANDARD_ARRAY_LIKE; + } + /** * Creates a join configuration with a separator and no prefix or suffix. * diff --git a/api/src/main/java/net/kyori/adventure/text/JoinConfigurationImpl.java b/api/src/main/java/net/kyori/adventure/text/JoinConfigurationImpl.java index beef7d3c8b..09cf1655f2 100644 --- a/api/src/main/java/net/kyori/adventure/text/JoinConfigurationImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/JoinConfigurationImpl.java @@ -39,6 +39,14 @@ final class JoinConfigurationImpl implements JoinConfiguration { static final Predicate DEFAULT_PREDICATE = componentLike -> true; static final JoinConfigurationImpl NULL = new JoinConfigurationImpl(); + static final JoinConfiguration STANDARD_NEW_LINES = JoinConfiguration.separator(Component.newline()); + static final JoinConfiguration STANDARD_COMMA_SEPARATED = JoinConfiguration.separator(Component.text(",")); + static final JoinConfiguration STANDARD_ARRAY_LIKE = JoinConfiguration.builder() + .separator(Component.text(", ")) + .prefix(Component.text("[")) + .suffix(Component.text("]")) + .build(); + private final Component prefix; private final Component suffix; private final Component separator; diff --git a/api/src/test/java/net/kyori/adventure/text/JoinTest.java b/api/src/test/java/net/kyori/adventure/text/JoinTest.java index 89f2494765..f1b92cc6af 100644 --- a/api/src/test/java/net/kyori/adventure/text/JoinTest.java +++ b/api/src/test/java/net/kyori/adventure/text/JoinTest.java @@ -257,6 +257,53 @@ final void testWithPredicate() { ); } + @Test + final void testStandardJoinConfigurationsNewLines() { + final Component result = Component.join(JoinConfiguration.newlines(), Component.text("line 1"), Component.text("line 2"), Component.text("line 3")); + assertEquals( + Component.text() + .append(Component.text("line 1")) + .append(Component.newline()) + .append(Component.text("line 2")) + .append(Component.newline()) + .append(Component.text("line 3")) + .build(), + result + ); + } + + @Test + final void testStandardJoinConfigurationsCommas() { + final Component result = Component.join(JoinConfiguration.commas(), Component.text("line 1"), Component.text("line 2"), Component.text("line 3")); + assertEquals( + Component.text() + .append(Component.text("line 1")) + .append(Component.text(",")) + .append(Component.text("line 2")) + .append(Component.text(",")) + .append(Component.text("line 3")) + .build(), + result + ); + } + + @Test + final void testStandardJoinConfigurationsArrayLike() { + final Component result = Component.join(JoinConfiguration.arrayLike(), Component.text("line 1"), Component.text("line 2"), Component.text("line 3")); + assertEquals( + Component.text() + .append(Component.text("[")) + .append(Component.text("line 1")) + .append(Component.text(", ")) + .append(Component.text("line 2")) + .append(Component.text(", ")) + .append(Component.text("line 3")) + .append(Component.text("]")) + .build(), + result + ); + } + private static final class TestComponentLike implements ComponentLike { @Override