package net.minecraft.network.chat; import com.google.common.collect.ImmutableList; import java.util.List; import java.util.Optional; import net.minecraft.util.Unit; public interface FormattedText { Optional STOP_ITERATION = Optional.of(Unit.INSTANCE); FormattedText EMPTY = new FormattedText() { @Override public Optional visit(FormattedText.ContentConsumer acceptor) { return Optional.empty(); } @Override public Optional visit(FormattedText.StyledContentConsumer acceptor, Style style) { return Optional.empty(); } }; Optional visit(FormattedText.ContentConsumer acceptor); Optional visit(FormattedText.StyledContentConsumer acceptor, Style style); static FormattedText of(String text) { return new FormattedText() { @Override public Optional visit(FormattedText.ContentConsumer acceptor) { return acceptor.accept(text); } @Override public Optional visit(FormattedText.StyledContentConsumer acceptor, Style style) { return acceptor.accept(style, text); } }; } static FormattedText of(String text, Style style) { return new FormattedText() { @Override public Optional visit(FormattedText.ContentConsumer acceptor) { return acceptor.accept(text); } @Override public Optional visit(FormattedText.StyledContentConsumer acceptor, Style style) { return acceptor.accept(style.applyTo(style), text); } }; } static FormattedText composite(FormattedText... elements) { return composite(ImmutableList.copyOf(elements)); } static FormattedText composite(List elements) { return new FormattedText() { @Override public Optional visit(FormattedText.ContentConsumer acceptor) { for (FormattedText formattedText : elements) { Optional optional = formattedText.visit(acceptor); if (optional.isPresent()) { return optional; } } return Optional.empty(); } @Override public Optional visit(FormattedText.StyledContentConsumer acceptor, Style style) { for (FormattedText formattedText : elements) { Optional optional = formattedText.visit(acceptor, style); if (optional.isPresent()) { return optional; } } return Optional.empty(); } }; } default String getString() { StringBuilder stringBuilder = new StringBuilder(); this.visit(string -> { stringBuilder.append(string); return Optional.empty(); }); return stringBuilder.toString(); } public interface ContentConsumer { Optional accept(String string); } public interface StyledContentConsumer { Optional accept(Style style, String string); } }