package mc.protocol.text; import lombok.Getter; import lombok.Setter; import javax.annotation.Nullable; import java.util.Optional; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Getter @Setter public class TextStyle { public static final TextStyle BOLD = new TextStyle(true, null, null, null, null); public static final TextStyle ITALIC = new TextStyle(null, true, null, null, null); public static final TextStyle UNDERLINE = new TextStyle(null, null, true, null, null); public static final TextStyle STRIKETHOUGH = new TextStyle(null, null, null, true, null); public static final TextStyle OBFUSCATED = new TextStyle(null, null, null, null, true); public static final TextStyle RESET = new TextStyle(false, false, false, false, false); private static class OptionalBoolean { private static final Optional TRUE = Optional.of(true); private static final Optional FALSE = Optional.of(false); private static final Optional NONE = Optional.empty(); static Optional of(boolean bool) { return bool ? TRUE : FALSE; } static Optional of(@Nullable Boolean bool) { if (bool != null) { return of(bool.booleanValue()); } return NONE; } } private Optional bold; private Optional italic; private Optional underline; private Optional strikethrough; private Optional obfuscated; public TextStyle(@Nullable Boolean bold, @Nullable Boolean italic, @Nullable Boolean underline, @Nullable Boolean strikethrough, @Nullable Boolean obfuscated) { this.bold = OptionalBoolean.of(bold); this.italic = OptionalBoolean.of(italic); this.underline = OptionalBoolean.of(underline); this.strikethrough = OptionalBoolean.of(strikethrough); this.obfuscated = OptionalBoolean.of(obfuscated); } public void merge(TextStyle style) { if (style.bold.isPresent()) this.bold = style.bold; if (style.italic.isPresent()) this.italic = style.italic; if (style.underline.isPresent()) this.underline = style.underline; if (style.strikethrough.isPresent()) this.strikethrough = style.strikethrough; if (style.obfuscated.isPresent()) this.obfuscated = style.obfuscated; } public static TextStyle none() { return new TextStyle(null,null,null,null, null); } }