ConverterColumnResultSet.java

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

import com.palantir.javapoet.CodeBlock;
import io.kaumei.jdbc.anno.gen.TargetMethod;
import io.kaumei.jdbc.anno.model.OptionalFlag;
import io.kaumei.jdbc.anno.model.SQLNameDV;
import io.kaumei.jdbc.anno.store.SourceDV;

import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Name;
import javax.lang.model.type.TypeMirror;
import java.util.Optional;

final class ConverterColumnResultSet extends Jdbc2JavaConverter {

    private final Element typeElement;
    private final Name methodName;

    ConverterColumnResultSet(TypeMirror type, SourceDV source, ExecutableElement method) {
        super(type, source);
        this.typeElement = method.getEnclosingElement();
        this.methodName = method.getSimpleName();
    }

    @Override
    public String toString() {
        return "ConverterColumnResultSet{typeElement=" + typeElement + ", methodName=" + methodName + '}';
    }

    // ------------------------------------------------------------------------

    @Override
    public boolean isColumn() {
        return true;
    }

    @Override
    public CodeBlock nullCheck(String varName) {
        return CodeBlock.of("$L == null", varName);
    }

    @Override
    public void addColumnByIndex(TargetMethod builder, String localVarName, ColumnIndex index, OptionalFlag optional) {
        builder.addComment("ConverterColumnResultSet.addColumnByIndex", "type", type(), "optional", optional);
        if (optional.isOptionalType()) {
            builder.addStatement("var $L = $T.ofNullable($T.$N(rs, $L))", localVarName,
                    Optional.class, this.typeElement, this.methodName, index.columnIndexVar());
        } else {
            builder.addStatement("var $L = $T.$N(rs, $L)", localVarName, this.typeElement, this.methodName, index.columnIndexVar());
            if (optional.isNonNull()) {
                builder.beginControlFlow("if($L)", nullCheck(localVarName));
                builder.addThrowColumnWasNull(index);
                builder.endControlFlow();
            }
        }
    }

    @Override
    public void addColumnByName(TargetMethod builder, String localVarName, SQLNameDV columnName, OptionalFlag optional) {
        builder.addComment("ConverterColumnResultSet.addColumnByName", "type", type(), "optional", optional);
        var index = ColumnIndex.ofVariable(builder.tempVarName(localVarName), columnName);
        builder.addStatement("var $N = rs.findColumn($S)", index.columnIndexVar(), index.columnName());
        addColumnByIndex(builder, localVarName, index, optional);
    }

}