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;
    }
}