package restx.shell;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.io.Resources;
import com.samskivert.mustache.Mustache;
import com.samskivert.mustache.Template;
import jline.console.completer.Completer;
import jline.console.completer.StringsCompleter;
import restx.common.MoreResources;
import restx.common.Mustaches;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* User: xavierhanin
* Date: 4/9/13
* Time: 10:24 PM
*/
public abstract class StdShellCommand implements ShellCommand {
private final ImmutableList<String> aliases;
private final String shortDescription;
protected StdShellCommand(ImmutableList<String> aliases, String shortDescription) {
this.aliases = Preconditions.checkNotNull(aliases);
if (aliases.isEmpty()) {
throw new IllegalArgumentException("aliases must not be empty");
}
this.shortDescription = shortDescription;
}
@Override
public Optional<? extends ShellCommandRunner> match(String line) {
for (String alias : aliases) {
if (matchCommand(line, alias)) {
return doMatch(line);
}
}
return Optional.absent();
}
private boolean matchCommand(String line, String commandName) {
return line.equals(commandName) || line.startsWith(commandName + " ");
}
protected abstract Optional<? extends ShellCommandRunner> doMatch(String line);
@Override
public void help(Appendable appendable) throws IOException {
RestxShell.printIn(appendable, String.format("%10s", aliases.get(0)), RestxShell.AnsiCodes.ANSI_GREEN);
appendable.append(" - " + getShortDescription() + "\n");
}
@Override
public void man(Appendable appendable) throws IOException {
RestxShell.printIn(appendable, aliases.get(0), RestxShell.AnsiCodes.ANSI_GREEN);
appendable.append(" - " + getShortDescription() + "\n");
if (aliases.size() > 1) {
appendable.append(" aliases: " + Joiner.on(", ").join(aliases.subList(1, aliases.size())) + "\n");
}
String resourceMan = resourceMan();
if (resourceMan != null) {
appendable.append("\n");
appendResourceMan(appendable, resourceMan);
appendable.append("\n\n");
}
}
protected String resourceMan() {
return null;
}
@Override
public Iterable<Completer> getCompleters() {
return Collections.<Completer>singleton(commandCompleter());
}
protected StringsCompleter commandCompleter() {
return new StringsCompleter(aliases);
}
public ImmutableList<String> getAliases() {
return aliases;
}
public String getShortDescription() {
return shortDescription;
}
protected List<String> splitArgs(String line) {
return RestxShell.splitArgs(line);
}
@Override
public void start(RestxShell shell) throws IOException {
}
protected Appendable appendResourceMan(Appendable appendable, String man) throws IOException {
return appendable.append(Resources.toString(Resources.getResource(man), Charsets.UTF_8));
}
}