TypeUtils.java

/*
 * SPDX-FileCopyrightText: 2025 Lucimber UG
 * SPDX-License-Identifier: Apache-2.0
 */
package com.lucimber.dbus.type;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/** A utility class that provides useful methods in conjunction with the D-Bus data types. */
public final class TypeUtils {

    private static final Map<Character, TypeAlignment> CHAR_TO_ALIGNMENT = new HashMap<>();
    private static final Map<Character, TypeCode> CHAR_TO_CODE = new HashMap<>();
    private static final Map<Character, Type> CHAR_TO_TYPE = new HashMap<>();
    private static final Map<TypeCode, Type> CODE_TO_TYPE = new HashMap<>();

    static {
        for (final Type type : Type.values()) {
            CHAR_TO_ALIGNMENT.put(type.getCode().getChar(), type.getAlignment());
            CHAR_TO_CODE.put(type.getCode().getChar(), type.getCode());
            CHAR_TO_TYPE.put(type.getCode().getChar(), type);
            CODE_TO_TYPE.put(type.getCode(), type);
        }
    }

    private TypeUtils() {
        // Utility class
    }

    /**
     * Gets the type's alignment from its char.
     *
     * @param c a {@link Character}
     * @return an {@link Optional} of {@link TypeAlignment}
     */
    public static Optional<TypeAlignment> getAlignmentFromChar(final char c) {
        return Optional.ofNullable(CHAR_TO_ALIGNMENT.get(c));
    }

    /**
     * Gets the type's code from its char.
     *
     * @param c a {@link Character}
     * @return an {@link Optional} of {@link TypeCode}
     */
    public static Optional<TypeCode> getCodeFromChar(final char c) {
        return Optional.ofNullable(CHAR_TO_CODE.get(c));
    }

    /**
     * Gets the type from its type char.
     *
     * @param c a {@link Character}
     * @return an {@link Optional} of {@link Type}
     */
    public static Optional<Type> getTypeFromChar(final char c) {
        return Optional.ofNullable(CHAR_TO_TYPE.get(c));
    }

    /**
     * Gets the type from its type code.
     *
     * @param code a {@link TypeCode}
     * @return an {@link Optional} of {@link Type}
     */
    public static Optional<Type> getTypeFromCode(final TypeCode code) {
        return Optional.ofNullable(CODE_TO_TYPE.get(code));
    }
}