summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/beust/jcommander/FuzzyMap.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/beust/jcommander/FuzzyMap.java')
-rw-r--r--src/main/java/com/beust/jcommander/FuzzyMap.java61
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;
+ }
+
+
+}