package qz.build.provision.params; import java.util.EnumSet; import java.util.HashSet; public interface EnumParser { /** * Basic enum parser */ static > T parse(Class clazz, String s) { return parse(clazz, s, null); } static > T parse(Class clazz, String s, T fallbackValue) { if(s != null) { for(T en : EnumSet.allOf(clazz)) { if (en.name().equalsIgnoreCase(s)) { return en; } } } return fallbackValue; } static > T parseStrict(Class clazz, String s, T ... blocklist) throws UnsupportedOperationException { if(s != null) { HashSet matched = parseSet(clazz, null, s); if (matched.size() == 1) { T returnVal = matched.iterator().next(); boolean blocked = false; for(T block : blocklist) { if(returnVal == block) { blocked = true; break; } } if(!blocked) { return returnVal; } } } throw new UnsupportedOperationException(String.format("%s value '%s' failed to match one and only one item", clazz.getSimpleName(), s)); } static > HashSet parseSet(Class clazz, T all, String s) { HashSet matched = new HashSet<>(); if(s != null) { // Handle ALL="*" if (all != null && s.equals("*")) { matched.add(all); } String[] parts = s.split("\\|"); for(String part : parts) { T parsed = parse(clazz, part); if (parsed != null) { matched.add(parsed); } } } return matched; } }