diff options
Diffstat (limited to 'src/main/java/com/beust/jcommander/FuzzyMap.java')
-rw-r--r-- | src/main/java/com/beust/jcommander/FuzzyMap.java | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/main/java/com/beust/jcommander/FuzzyMap.java b/src/main/java/com/beust/jcommander/FuzzyMap.java new file mode 100644 index 0000000..5f3939b --- /dev/null +++ b/src/main/java/com/beust/jcommander/FuzzyMap.java @@ -0,0 +1,61 @@ +package com.beust.jcommander; + +import com.beust.jcommander.internal.Maps; + +import java.util.Map; + +/** + * Helper class to perform fuzzy key look ups: looking up case insensitive or + * abbreviated keys. + */ +public class FuzzyMap { + interface IKey { + String getName(); + } + + public static <V> V findInMap(Map<? extends IKey, V> map, IKey name, + boolean caseSensitive, boolean allowAbbreviations) { + if (allowAbbreviations) { + return findAbbreviatedValue(map, name, caseSensitive); + } else { + if (caseSensitive) { + return map.get(name); + } else { + for (IKey c : map.keySet()) { + if (c.getName().equalsIgnoreCase(name.getName())) { + return map.get(c); + } + } + } + } + return null; + } + + private static <V> V findAbbreviatedValue(Map<? extends IKey, V> map, IKey name, + boolean caseSensitive) { + String string = name.getName(); + Map<String, V> results = Maps.newHashMap(); + for (IKey c : map.keySet()) { + String n = c.getName(); + boolean match = (caseSensitive && n.startsWith(string)) + || ((! caseSensitive) && n.toLowerCase().startsWith(string.toLowerCase())); + if (match) { + results.put(n, map.get(c)); + } + } + + V result; + if (results.size() > 1) { + throw new ParameterException("Ambiguous option: " + name + + " matches " + results.keySet()); + } else if (results.size() == 1) { + result = results.values().iterator().next(); + } else { + result = null; + } + + return result; + } + + +} |