MessageResultNullableImpl.java
/*
* SPDX-FileCopyrightText: 2025 kaumei.io
* SPDX-License-Identifier: Apache-2.0
*/
package io.kaumei.jdbc.anno.msg;
import org.jspecify.annotations.Nullable;
final class MessageResultNullableImpl<T> implements Msg.NullableResult<T> {
private final @Nullable T value;
private final Msg.Messages messages;
MessageResultNullableImpl(Msg.Messages messages) {
if (messages.hasNoMessages()) {
throw new IllegalArgumentException("messages must not be empty");
}
this.value = null;
this.messages = messages;
}
MessageResultNullableImpl(@Nullable T value) {
this.value = value;
this.messages = Msg.empty();
}
@Override
public String toString() {
if (this.messages.hasMessages()) {
return "MessageResultNullable" + this.messages;
} else {
return "MessageResultNullable[" + this.value + "]";
}
}
// interface Msg.MessageState ---------------------------------------------
@Override
public boolean hasMessages() {
return this.messages.hasMessages();
}
@Override
public Msg.Messages messages() {
return this.messages;
}
// interface Msg.NullableResult -------------------------------------------
@Override
public boolean isNull() {
return !messages.hasMessages() && value == null;
}
@Override
public T value() {
if (messages.hasMessages()) {
throw new IllegalStateException("messages are not empty");
} else if (value == null) {
throw new IllegalStateException("value is null");
}
return value;
}
@Override
public @Nullable T valueOpt() {
if (messages.hasMessages()) {
throw new IllegalStateException("messages are not empty");
}
return this.value;
}
}