AnnoElementValueMap.java

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

import io.kaumei.jdbc.anno.ProcessorException;
import org.jspecify.annotations.Nullable;

import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AnnoElementValueMap {

    private final Map<String, AnnotationValue> values = new HashMap<>();

    public AnnoElementValueMap(AnnotationMirror annoMirror) {
        for (var entry : annoMirror.getElementValues().entrySet()) {
            var propertyName = entry.getKey().getSimpleName().toString();
            values.put(propertyName, entry.getValue());
        }
    }

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

    public int getInteger(String name, int defaultValue) {
        try {
            var annoValue = values.get(name);
            if (annoValue == null) {
                return defaultValue;
            }
            return (Integer) annoValue.getValue();
        } catch (RuntimeException e) {
            throw new ProcessorException("Illegal state: name=" + name + ", msg=" + e.getMessage(), e);
        }
    }

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


    public String getString(String name, String defaultValue) {
        try {
            var annoValue = values.get(name);
            if (annoValue == null) {
                return defaultValue;
            }
            return (String) annoValue.getValue();
        } catch (RuntimeException e) {
            throw new ProcessorException("Illegal state: name=" + name + ", msg=" + e.getMessage(), e);
        }
    }

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

    public <T extends Enum<T>> T getEnum(String name, Class<T> cls, T defaultValue) {
        try {
            var annoValue = values.get(name);
            if (annoValue == null) {
                return defaultValue;
            }
            var constantName = ((VariableElement) annoValue.getValue()).getSimpleName().toString();
            return Enum.valueOf(cls, constantName);
        } catch (RuntimeException e) {
            throw new ProcessorException("Illegal state: name=" + name + ", msg=" + e.getMessage(), e);
        }
    }

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

    @Nullable
    public TypeMirror getTypeMirror(String name) {
        try {
            var annoValue = values.get(name);
            if (annoValue == null) {
                return null;
            }
            return (TypeMirror) annoValue.getValue();
        } catch (RuntimeException e) {
            throw new ProcessorException("Illegal state: name=" + name + ", msg=" + e.getMessage(), e);
        }
    }

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

    public TypeMirror[] getTypeMirrorArray(String name) {
        int i = 0;
        try {
            var annoValue = values.get(name);
            if (annoValue == null) {
                return Context.EMPTY_TYPE_MIRROR_ARRAY;
            }
            var list = (List<?>) annoValue.getValue();
            var result = new TypeMirror[list.size()];
            for (var entry : list) {
                var av = (AnnotationValue) entry;
                result[i++] = (TypeMirror) av.getValue();
            }
            return result;
        } catch (RuntimeException e) {
            throw new ProcessorException("Illegal state: name=" + name + ", i=" + i + ", msg=" + e.getMessage(), e);
        }
    }

}