From 5d4384ae814fd7da4ac738d2d63542664b3aa170 Mon Sep 17 00:00:00 2001 From: Bjarne Koll Date: Sun, 24 Oct 2021 02:18:37 +0200 Subject: [PATCH] Add standard join configurations While using join configurations is already rather simple, they tend to clutter up already rather verbose source code. While the initial creation of the JoinConfiguration already included a null configuration, accessible through 'JoinConfiguration#noSeparators', other standards or often used layouts were not added. This commit adds three more defaults/standards to the join configuration implementation that are exposed through static accessors in the join configuration interface. Specifically: newLines: A straight forward instance of the join configuraiton that uses the new line component to join together components. commas: Another straight forward instance of the join configuration that uses a single comma (or potentially a comma and a space) to join together components. arrayLike: A more complex join configuration that recreates the layout used by the java.util.Arrays#toString method. Resolves: #466 --- .../adventure/text/JoinConfiguration.java | 42 +++++++++++++ .../adventure/text/JoinConfigurationImpl.java | 9 +++ .../net/kyori/adventure/text/JoinTest.java | 62 +++++++++++++++++++ 3 files changed, 113 insertions(+) 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 41c36df38..4f7f11f83 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,48 @@ public interface JoinConfiguration extends BuildableA 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 either the output 'hello,there' or 'hello, there' depending on whether the passed boolean flag was {@code false} or {@code true} respectively.

+ * + * @param spaces a plain boolean flag indicating whether the returned comma-based join configuration should append a single space after each comma or not + * @return the join configuration + * @since 4.10.0 + */ + static @NotNull JoinConfiguration commas(final boolean spaces) { + return spaces ? JoinConfigurationImpl.STANDARD_COMMA_SPACE_SEPARATED : 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 beef7d3c8..f68350306 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,15 @@ 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_COMMA_SPACE_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 89f249476..eece31b68 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,68 @@ 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(false), 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 testStandardJoinConfigurationsCommasSpaced() { + final Component result = Component.join(JoinConfiguration.commas(true), 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