MessageResultImpl.java

/*
 * SPDX-FileCopyrightText: 2025 kaumei.io
 * SPDX-License-Identifier: Apache-2.0
 */
package io.kaumei.jdbc.anno.msg;

import org.jspecify.annotations.Nullable;

import static io.kaumei.jdbc.anno.utils.AnnoUtils.requireState;
import static java.util.Objects.requireNonNull;

final class MessageResultImpl<T> implements Msg.Result<T> {
    private final @Nullable T value;
    private final Msg.Messages messages;

    MessageResultImpl(Msg.Messages messages) {
        if (messages.hasNoMessages()) {
            throw new IllegalArgumentException("messages must not be empty");
        }
        this.value = null;
        this.messages = messages;
    }

    MessageResultImpl(T value) {
        this.value = requireNonNull(value, "value");
        this.messages = Msg.empty();
    }

    @Override
    public String toString() {
        if (this.value == null) {
            return "MessageResult" + this.messages;
        } else {
            return "MessageResult[" + this.value + "]";
        }
    }

    // interface Msg.MessageState ---------------------------------------------

    @Override
    public boolean hasMessages() {
        return this.messages.hasMessages();
    }

    @Override
    public Msg.Messages messages() {
        return this.messages;
    }

    // interface Msg.Result ---------------------------------------------------

    @Override
    public T value() {
        return requireState(this.value, "messages are not empty");
    }

    @Override
    public @Nullable T valueOrNull() {
        return value;
    }

}