/*******************************************************************************
* Copyright (c) 2013 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package com.github.rustdt.ide.ui.wizards;
import static melnorme.utilbox.core.CoreUtil.list;
import static melnorme.utilbox.misc.MiscUtil.getClassResource;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.widgets.Composite;
import com.github.rustdt.tooling.cargo.CargoManifestParser;
import com.github.rustdt.tooling.cargo.RustNamingRules;
import melnorme.lang.ide.core.operations.RunToolOperation.RunSDKToolOperation;
import melnorme.lang.ide.core.utils.EclipseUtils;
import melnorme.lang.ide.ui.WizardMessages_Actual;
import melnorme.lang.ide.ui.dialogs.LangNewProjectWizard;
import melnorme.lang.ide.ui.dialogs.LangProjectWizardFirstPage;
import melnorme.util.swt.components.fields.CheckBoxField;
import melnorme.utilbox.concurrency.OperationCancellation;
import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.status.Severity;
import melnorme.utilbox.status.StatusException;
/**
* Rust New Project Wizard.
*/
public class RustProjectWizard extends LangNewProjectWizard {
protected final RustProjectWizardFirstPage firstPage = new RustProjectWizardFirstPage();
@Override
public LangProjectWizardFirstPage getFirstPage() {
return firstPage;
}
@Override
public WizardPage getSecondPage() {
return null;
}
@Override
public void addPages() {
addPage(firstPage);
}
protected static final String HelloWorld_ManifestContents = getClassResource(
RustProjectWizard.class, "hello_world.Cargo.toml");
protected static final String HelloWorld_ModuleContents = getClassResource(
RustProjectWizard.class, "hello_world.rs");
@Override
protected void configureCreatedProject(ProjectCreator_ForWizard projectCreator, IProgressMonitor monitor)
throws CommonException, OperationCancellation, CoreException {
if(firstPage.useCargoInit.getBooleanFieldValue()) {
new RunSDKToolOperation(getProject(), list("init")).execute(EclipseUtils.om(monitor));
} else {
configureHelloWorld(projectCreator, monitor);
}
}
protected void configureHelloWorld(ProjectCreator_ForWizard projectCreator, IProgressMonitor monitor)
throws CoreException {
String cargoManifest = HelloWorld_ManifestContents.replaceAll(Pattern.quote("$project_name$"),
getProject().getName());
boolean manifestCreated = projectCreator.createFile(getProject().getFile(CargoManifestParser.MANIFEST_FILENAME.toString()),
cargoManifest, false, monitor);
if(!manifestCreated) {
// Cargo crate already exists
return;
} else {
IFile mainModule = getProject().getFolder("src").getFile("main.rs");
projectCreator.createFile(mainModule, HelloWorld_ModuleContents, true, monitor);
}
}
}
class RustProjectWizardFirstPage extends LangProjectWizardFirstPage {
protected final CheckBoxField useCargoInit = new CheckBoxField("Use `cargo init` to create project.");
public RustProjectWizardFirstPage() {
super();
setTitle(WizardMessages_Actual.LangNewProject_Page1_pageTitle);
setDescription(WizardMessages_Actual.LangNewProject_Page1_pageDescription);
useCargoInit.set(true);
useCargoInit.addChangeListener(() -> nameGroup.nameField().fireFieldValueChanged());
}
@Override
protected NameGroup createNameGroup() {
return new NameGroup() {
@Override
public void validateProjectName() throws StatusException {
super.validateProjectName();
try {
RustNamingRules.validateCrateName(getName());
} catch(StatusException e) {
if(useCargoInit.getBooleanFieldValue()) {
throw e;
} else {
// Change validation to Warning
throw new StatusException(Severity.WARNING,
e.getMessage() +
" The crate name will need to changed if the project is created with this name.");
}
}
}
};
}
@Override
protected void createContents_ValidationGroups(Composite parent) {
useCargoInit.createComponent(parent, sectionGDF().create());
super.createContents_ValidationGroups(parent);
}
}