106 lines
2.3 KiB
Java
106 lines
2.3 KiB
Java
package net.filebot.cli;
|
|
|
|
import static net.filebot.util.FileUtilities.*;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.Map;
|
|
|
|
import org.kohsuke.args4j.CmdLineException;
|
|
import org.kohsuke.args4j.CmdLineParser;
|
|
import org.kohsuke.args4j.OptionDef;
|
|
import org.kohsuke.args4j.spi.FieldSetter;
|
|
import org.kohsuke.args4j.spi.MapOptionHandler;
|
|
import org.kohsuke.args4j.spi.Parameters;
|
|
import org.kohsuke.args4j.spi.Setter;
|
|
|
|
public class BindingsHandler extends MapOptionHandler {
|
|
|
|
public BindingsHandler(CmdLineParser parser, OptionDef option, Setter<? super Map<?, ?>> setter) {
|
|
super(parser, option, setter);
|
|
}
|
|
|
|
@Override
|
|
public String getDefaultMetaVariable() {
|
|
return "[name=value]";
|
|
}
|
|
|
|
@Override
|
|
public int parseArguments(Parameters params) throws CmdLineException {
|
|
FieldSetter fs = setter.asFieldSetter();
|
|
Map map = (Map) fs.getValue();
|
|
if (map == null) {
|
|
map = createNewCollection(fs.getType());
|
|
fs.addValue(map);
|
|
}
|
|
|
|
int pos = 0;
|
|
while (pos < params.size()) {
|
|
if (params.getParameter(pos).startsWith("-")) {
|
|
return pos;
|
|
}
|
|
|
|
String[] nv = params.getParameter(pos).split("=", 2);
|
|
if (nv.length < 2) {
|
|
return pos;
|
|
}
|
|
|
|
String n = getName(nv[0].trim());
|
|
String v = getValue(nv[1].trim());
|
|
|
|
addToMap(map, n, v);
|
|
pos++;
|
|
}
|
|
|
|
return pos;
|
|
}
|
|
|
|
public String getName(String n) throws CmdLineException {
|
|
if (!isIdentifier(n)) {
|
|
throw new CmdLineException(owner, "\"" + n + "\" is not a valid identifier", null);
|
|
}
|
|
return n;
|
|
}
|
|
|
|
public String getValue(String v) throws CmdLineException {
|
|
if (v.startsWith("@")) {
|
|
File f = new File(v.substring(1));
|
|
try {
|
|
return readTextFile(f).trim();
|
|
} catch (IOException e) {
|
|
throw new CmdLineException(owner, e.getMessage(), e);
|
|
}
|
|
}
|
|
return v;
|
|
}
|
|
|
|
public boolean isIdentifier(String n) {
|
|
if (n == null || n.isEmpty()) {
|
|
return false;
|
|
}
|
|
|
|
for (int i = 0; i < n.length();) {
|
|
int c = n.codePointAt(i);
|
|
|
|
if (i == 0) {
|
|
if (!Character.isUnicodeIdentifierStart(c))
|
|
return false;
|
|
} else {
|
|
if (!Character.isUnicodeIdentifierPart(c))
|
|
return false;
|
|
}
|
|
|
|
i += Character.charCount(c);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
protected Map createNewCollection(Class<? extends Map> type) {
|
|
return new LinkedHashMap(); // make sure to preserve order of arguments
|
|
}
|
|
|
|
}
|