Skip to content

Commit

Permalink
Add standard join configurations
Browse files Browse the repository at this point in the history
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 to join together components, creating a CSV like
  layout.

arrayLike:
  A more complex join configuration that recreates the layout used by
  the java.util.Arrays#toString method.

Resolves: #466
  • Loading branch information
lynxplay committed Oct 24, 2021
1 parent 0eab517 commit 4e565d4
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 0 deletions.
47 changes: 47 additions & 0 deletions api/src/main/java/net/kyori/adventure/text/JoinConfiguration.java
Expand Up @@ -99,6 +99,53 @@ public interface JoinConfiguration extends Buildable<JoinConfiguration, JoinConf
return JoinConfigurationImpl.NULL;
}

/**
* Provides a join configuration with no prefix or suffix that simply joins the components together using the {@link Component#newline()} component.
*
* <p>
* 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'.
* </p>
*
* @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.
*
* <p>
* 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'.
* </p>
*
* @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.
*
<p>
* 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]'.
* </p>
*
* @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.
*
Expand Down
Expand Up @@ -39,6 +39,14 @@ final class JoinConfigurationImpl implements JoinConfiguration {
static final Predicate<ComponentLike> 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;
Expand Down
47 changes: 47 additions & 0 deletions api/src/test/java/net/kyori/adventure/text/JoinTest.java
Expand Up @@ -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
Expand Down

0 comments on commit 4e565d4

Please sign in to comment.