MorphToEnum.java

package org.klojang.convert;

import java.util.HashMap;
import java.util.Map;
import java.util.OptionalInt;

@SuppressWarnings({"rawtypes", "unchecked"})
final class MorphToEnum {

  private MorphToEnum() {
    throw new UnsupportedOperationException();
  }

  private static final Map<Class, EnumParser> parsers = new HashMap<>();

  static <T extends Enum<T>> T morph(Object obj, Class enumClass) {
    EnumParser parser = parsers.computeIfAbsent(enumClass, EnumParser::new);
    if (obj instanceof Character c) {
      if (c >= '0' && c <= '9') {
        return (T) parser.parse(c - 48);
      }
    } else if (obj instanceof String s) {
      OptionalInt opt = NumberMethods.toInt(s);
      if (opt.isPresent()) {
        return (T) parser.parse(opt.getAsInt());
      }
    }
    return (T) parsers.computeIfAbsent(enumClass, EnumParser::new).parse(obj);
  }

}