Skip to content

Commit

Permalink
ConsoleEngineImpl: added alias and unalias commands
Browse files Browse the repository at this point in the history
  • Loading branch information
mattirn committed Jan 26, 2020
1 parent 84cf18e commit 7c3a8e3
Show file tree
Hide file tree
Showing 8 changed files with 226 additions and 67 deletions.
23 changes: 23 additions & 0 deletions builtins/src/main/java/org/jline/builtins/ConsoleEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@
*/
public interface ConsoleEngine extends CommandRegistry {

/**
* Removes command first character if it is colon
* @param command
* @return
*/
static String plainCommand(String command) {
return command.startsWith(":") ? command.substring(1) : command;
}

/**
* Sets systemRegistry
* @param systemRegistry
Expand All @@ -43,6 +52,20 @@ public interface ConsoleEngine extends CommandRegistry {
*/
List<String> scripts();

/**
* Returns true if alias 'name' exists
* @param alias name
* @return
*/
boolean hasAlias(String name);

/**
* Returns alias 'name' value
* @param alias name
* @return value of alias
*/
String getAlias(String name);

/**
* Returns script and variable completers
* @return completers
Expand Down
197 changes: 148 additions & 49 deletions builtins/src/main/java/org/jline/builtins/ConsoleEngineImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
Expand Down Expand Up @@ -47,14 +48,15 @@ public class ConsoleEngineImpl implements ConsoleEngine {
public enum Command {SHOW
, DEL
, PRNT
, ECHO
, ALIAS
, UNALIAS
, SLURP};
private static final String VAR_PRNT_OPTIONS = "PRNT_OPTIONS";
private static final String VAR_PATH = "PATH";
private static final String VAR_NANORC = "NANORC";
private static final String[] OPTION_HELP = {"-?", "--help"};
private static final String OPTION_VERBOSE = "-v";
private static final String HELP_END = "HELP_END";
private static final String END_HELP = "END_HELP";
private static final int HELP_MAX_SIZE = 30;
private final ScriptEngine engine;
private Map<Command,String> commandName = new HashMap<>();
Expand All @@ -64,12 +66,18 @@ public enum Command {SHOW
private Exception exception;
private SystemRegistry systemRegistry;
private String scriptExtension = "jline";
private Parser parser;
private Terminal terminal;
private final Parser parser;
private final Terminal terminal;
private final Supplier<Path> workDir;
private ConfigurationPath configPath;
private final ConfigurationPath configPath;
private final Map<String, String> aliases = new HashMap<>();
private Path aliasFile;

public ConsoleEngineImpl(ScriptEngine engine, Parser parser, Terminal terminal, Supplier<Path> workDir, ConfigurationPath configPath) {
@SuppressWarnings("unchecked")
public ConsoleEngineImpl(ScriptEngine engine
, Parser parser
, Terminal terminal
, Supplier<Path> workDir, ConfigurationPath configPath) throws IOException {
this.engine = engine;
this.parser = parser;
this.terminal = terminal;
Expand All @@ -83,8 +91,16 @@ public ConsoleEngineImpl(ScriptEngine engine, Parser parser, Terminal terminal,
commandExecute.put(Command.DEL, new CommandMethods(this::del, this::variableCompleter));
commandExecute.put(Command.SHOW, new CommandMethods(this::show, this::variableCompleter));
commandExecute.put(Command.PRNT, new CommandMethods(this::prnt, this::prntCompleter));
commandExecute.put(Command.ECHO, new CommandMethods(this::echo, this::echoCompleter));
commandExecute.put(Command.SLURP, new CommandMethods(this::slurp, this::slurpCompleter));
commandExecute.put(Command.SLURP, new CommandMethods(this::slurpcmd, this::slurpCompleter));
commandExecute.put(Command.ALIAS, new CommandMethods(this::aliascmd, this::aliasCompleter));
commandExecute.put(Command.UNALIAS, new CommandMethods(this::unalias, this::unaliasCompleter));
aliasFile = configPath.getUserConfig("aliases.json");
if (aliasFile == null) {
aliasFile = configPath.getUserConfig("aliases.json", true);
engine.persist(aliasFile, aliases);
} else {
aliases.putAll((Map<String,String>)slurp(aliasFile));
}
}

@Override
Expand Down Expand Up @@ -114,6 +130,16 @@ public boolean hasCommand(String name) {
return false;
}

@Override
public boolean hasAlias(String name) {
return aliases.containsKey(name);
}

@Override
public String getAlias(String name) {
return aliases.getOrDefault(name, null);
}

private void doNameCommand() {
nameCommand = commandName.entrySet()
.stream()
Expand Down Expand Up @@ -372,8 +398,8 @@ public boolean execute() throws Exception {
size++;
l = l.replaceAll("\\s+$", "");
String line = l;
if (size > HELP_MAX_SIZE || line.endsWith(HELP_END)) {
helpEnd = line.endsWith(HELP_END);
if (size > HELP_MAX_SIZE || line.endsWith(END_HELP)) {
helpEnd = line.endsWith(END_HELP);
break;
}
if (l.trim().startsWith("*") || l.trim().startsWith("#")) {
Expand Down Expand Up @@ -472,10 +498,7 @@ public Object execute(ParsedLine pl) throws Exception {
return null;
}
String[] args = pl.words().subList(1, pl.words().size()).toArray(new String[0]);
String cmd = Parser.getCommand(pl.word());
if (cmd.startsWith(":")) {
cmd = cmd.substring(1);
}
String cmd = ConsoleEngine.plainCommand(Parser.getCommand(pl.word()));
Object out = null;
ScriptFile file = new ScriptFile(cmd, pl.line(), args);
if (file.execute()) {
Expand Down Expand Up @@ -680,24 +703,6 @@ private Object del(Builtins.CommandInput input) {
return null;
}

private Object echo(Builtins.CommandInput input) {
final String[] usage = {
"echo - print object",
"Usage: echo object",
" -? --help Displays command help",
};
Options opt = Options.compile(usage).parse(input.xargs());
if (opt.isSet("help")) {
exception = new HelpException(opt.usage());
return null;
}
List<Object> args = opt.argObjects();
if (args.size() > 0) {
println(defaultPrntOptions(), args.get(0));
}
return null;
}

private Object prnt(Builtins.CommandInput input) {
final String[] usage = {
"prnt - print object",
Expand Down Expand Up @@ -730,7 +735,7 @@ private Object prnt(Builtins.CommandInput input) {
return null;
}

private Object slurp(Builtins.CommandInput input) {
private Object slurpcmd(Builtins.CommandInput input) {
final String[] usage = {
"slurp - slurp file context to string/object",
"Usage: slurp [OPTIONS] file",
Expand All @@ -747,20 +752,84 @@ private Object slurp(Builtins.CommandInput input) {
try {
if (!opt.args().isEmpty()){
Charset encoding = opt.isSet("encoding") ? Charset.forName(opt.get("encoding")): StandardCharsets.UTF_8;
byte[] encoded = Files.readAllBytes(Paths.get(opt.args().get(0)));
String format = opt.isSet("format") ? opt.get("format") : "";
if (format.equalsIgnoreCase("TXT")) {
out = new String(encoded, encoding);
} else {
out = engine.expandParameter(new String(encoded, encoding), format);
}
out = slurp(Paths.get(opt.args().get(0)), encoding, format);
}
} catch (Exception e) {
exception = e;
}
return out;
}

private Object slurp(Path file) throws IOException {
return slurp(file, StandardCharsets.UTF_8, "JSON");
}

private Object slurp(Path file, Charset encoding, String format) throws IOException {
Object out = null;
byte[] encoded = Files.readAllBytes(file);
if (format.equalsIgnoreCase("TXT")) {
out = new String(encoded, encoding);
} else {
out = engine.expandParameter(new String(encoded, encoding), format);
}
return out;
}

private Object aliascmd(Builtins.CommandInput input) {
final String[] usage = {
"alias - create command alias",
"Usage: alias [ALIAS] [COMMANDLINE]",
" -? --help Displays command help"
};
Options opt = Options.compile(usage).parse(input.args());
if (opt.isSet("help")) {
exception = new HelpException(opt.usage());
return null;
}
Object out = null;
try {
List<String> args = opt.args();
if (args.isEmpty()) {
out = aliases;
} else if (args.size() == 1) {
out = aliases.getOrDefault(args.get(0), null);
} else {
aliases.put(args.get(0), String.join(" ", args.subList(1, args.size())));
engine.persist(aliasFile, aliases);
}
} catch (Exception e) {
exception = e;
}
return out;
}

private Object unalias(Builtins.CommandInput input) {
final String[] usage = {
"unalias - remove command alias",
"Usage: unalias [ALIAS...]",
" -? --help Displays command help"
};
Options opt = Options.compile(usage).parse(input.args());
if (opt.isSet("help")) {
exception = new HelpException(opt.usage());
return null;
}
Object out = null;
try {
for (String a : opt.args()) {
if (aliases.containsKey(a)) {
aliases.remove(a);
}
}
} catch (Exception e) {
exception = e;
} finally {
engine.persist(aliasFile, aliases);
}
return out;
}

private List<OptDesc> commandOptions(String command) {
try {
invoke(command, "--help");
Expand All @@ -775,8 +844,7 @@ private List<OptDesc> commandOptions(String command) {
private List<Completer> slurpCompleter(String command) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new OptionCompleter(new ArgumentCompleter(new FilesCompleter(workDir)
, NullCompleter.INSTANCE)
, new OptionCompleter(new FilesCompleter(workDir)
, this::commandOptions
, 1)
));
Expand All @@ -797,21 +865,52 @@ private List<String> variableReferences() {
return out;
}

private List<Completer> echoCompleter(String command) {
List<Completer> completers = new ArrayList<>();
completers.add(new StringsCompleter(this::variableReferences));
return completers;
}

private List<Completer> prntCompleter(String command) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new OptionCompleter(new ArgumentCompleter(new StringsCompleter(this::variableReferences)
, NullCompleter.INSTANCE)
, new OptionCompleter(new StringsCompleter(this::variableReferences)
, this::commandOptions
, 1)
));
return completers;
}

private static class AliasValueCompleter implements Completer {
private final Map<String,String> aliases;

public AliasValueCompleter(Map<String,String> aliases) {
this.aliases = aliases;
}

@Override
public void complete(LineReader reader, ParsedLine commandLine, List<Candidate> candidates) {
assert commandLine != null;
assert candidates != null;
List<String> words = commandLine.words();
if (words.size() > 1) {
String h = words.get(words.size()-2);
if (h != null && h.length() > 0) {
if(aliases.containsKey(h)){
String v = aliases.get(h);
candidates.add(new Candidate(AttributedString.stripAnsi(v)
, v, null, null, null, null, true));
}
}
}
}
}

private List<Completer> aliasCompleter(String command) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE
, new StringsCompleter(aliases::keySet), new AliasValueCompleter(aliases), NullCompleter.INSTANCE));
return completers;
}

private List<Completer> unaliasCompleter(String command) {
List<Completer> completers = new ArrayList<>();
completers.add(new ArgumentCompleter(NullCompleter.INSTANCE, new StringsCompleter(aliases::keySet)));
return completers;
}

}
Loading

0 comments on commit 7c3a8e3

Please sign in to comment.