package com.jetbrains.lang.dart.projectWizard;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.process.CapturingProcessHandler;
import com.intellij.execution.process.ProcessOutput;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.SystemProperties;
import com.jetbrains.lang.dart.sdk.DartSdkUtil;
import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Stagehand {
public static class StagehandDescriptor {
public final String myId;
public final String myLabel;
public final String myDescription;
public final String myEntrypoint;
public StagehandDescriptor(String id, String label, String description, String entrypoint) {
myId = id;
myLabel = label;
myDescription = description;
myEntrypoint = entrypoint;
}
@Override
public String toString() {
return StringUtil.join("[", myId, ",", myLabel, ",", myDescription, ",", myEntrypoint, "]");
}
}
public static class StagehandException extends Exception {
public StagehandException(String message) {
super(message);
}
public StagehandException(Throwable t) {
super(t);
}
}
private static final Logger LOG = Logger.getInstance("#com.jetbrains.lang.dart.projectWizard.Stagehand");
private static final List<StagehandDescriptor> EMPTY = new ArrayList<>();
private static final class PubRunner {
private final String myWorkingDirectory;
PubRunner() {
myWorkingDirectory = null;
}
PubRunner(final VirtualFile workingDirectory) {
myWorkingDirectory = workingDirectory.getCanonicalPath();
}
ProcessOutput runSync(final @NotNull String sdkRoot, int timeoutInSeconds, String... pubParameters) throws StagehandException {
final GeneralCommandLine command = new GeneralCommandLine().withWorkDirectory(myWorkingDirectory);
final File pubFile = new File(DartSdkUtil.getPubPath(sdkRoot));
command.setExePath(pubFile.getPath());
command.addParameters(pubParameters);
try {
return new CapturingProcessHandler(command).runProcess(timeoutInSeconds * 1000, false);
}
catch (ExecutionException e) {
throw new StagehandException(e);
}
}
}
public void generateInto(@NotNull final String sdkRoot,
@NotNull final VirtualFile projectDirectory,
@NotNull final String templateId) throws StagehandException {
final ProcessOutput output = new PubRunner(projectDirectory)
.runSync(sdkRoot, 30, "global", "run", "stagehand", "--author", SystemProperties.getUserName(), templateId);
if (output.getExitCode() != 0) {
throw new StagehandException(output.getStderr());
}
}
public List<StagehandDescriptor> getAvailableTemplates(@NotNull final String sdkRoot) {
try {
final ProcessOutput output = new PubRunner().runSync(sdkRoot, 10, "global", "run", "stagehand", "--machine");
int exitCode = output.getExitCode();
if (exitCode != 0) {
return EMPTY;
}
// [{"name":"consoleapp", "label":"Console App", "description":"A minimal command-line application."}, {"name": ..., }]
JSONArray arr = new JSONArray(output.getStdout());
List<StagehandDescriptor> result = new ArrayList<>();
for (int i = 0; i < arr.length(); i++) {
JSONObject obj = arr.getJSONObject(i);
result.add(new StagehandDescriptor(
obj.getString("name"),
obj.optString("label"),
obj.getString("description"),
obj.optString("entrypoint")));
}
return result;
}
catch (StagehandException | JSONException e) {
LOG.info(e);
}
return EMPTY;
}
public void install(@NotNull final String sdkRoot) {
try {
new PubRunner().runSync(sdkRoot, 60, "global", "activate", "stagehand");
}
catch (StagehandException e) {
LOG.info(e);
}
}
}