MsgBuilderImpl.java
/*
* SPDX-FileCopyrightText: 2025 kaumei.io
* SPDX-License-Identifier: Apache-2.0
*/
package io.kaumei.jdbc.anno.msg;
import org.jspecify.annotations.Nullable;
import java.util.TreeSet;
import java.util.function.Supplier;
final class MsgBuilderImpl implements Msg.Builder {
private final TreeSet<Msg.Message> messages = new TreeSet<>();
MsgBuilderImpl() {
}
@Override
public String toString() {
return build().toString();
}
// interface Msg.Builder --------------------------------------------------
@Override
public boolean hasMessages() {
return !messages.isEmpty();
}
@Override
public boolean hasNoMessages() {
return messages.isEmpty();
}
@Override
public String join(String sep) {
var sb = new StringBuilder();
for (Msg.Message message : messages) {
if (!sb.isEmpty()) {
sb.append(sep);
}
sb.append(message.text());
}
return sb.toString();
}
@Override
public void requireEmpty() {
if (!messages.isEmpty()) {
throw new IllegalStateException("List not empty: " + join(", "));
}
}
@Override
public Msg.Messages build() {
return messages.isEmpty() ? Msg.empty() : new MessagesImpl(messages);
}
@Override
public <T> Msg.Result<T> build(T value) {
return build().build(value);
}
@Override
public <T> Msg.Result<T> build(Supplier<T> func) {
return build().build(func);
}
@Override
public <T> Msg.NullableResult<T> buildOpt(@Nullable T value) {
return build().buildOpt(value);
}
@Override
public Msg.Builder add(Msg.Message msg) {
messages.add(msg);
return this;
}
@Override
public Msg.Builder add(boolean test, Msg.Message msg) {
if (test) {
messages.add(msg);
}
return this;
}
@Override
public Msg.Builder add(Supplier<Boolean> test, Msg.Message msg) {
if (test.get()) {
messages.add(msg);
}
return this;
}
@Override
public Msg.Builder add(Msg.Messages msg) {
for (var m : msg) {
messages.add(m);
}
return this;
}
@Override
public Msg.Builder add(Msg.@Nullable HasMessages value) {
if (value != null && value.hasMessages()) {
add(value.messages());
}
return this;
}
}