package com.haskforce.settings;
import com.haskforce.jps.model.HaskellBuildOptions;
import com.haskforce.jps.model.JpsHaskellBuildOptionsSerializer;
import com.haskforce.utils.ExecUtil;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.components.StorageScheme;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@State(
name = JpsHaskellBuildOptionsSerializer.HASKELL_BUILD_OPTIONS_COMPONENT_NAME,
storages = {
@Storage("compiler.xml")
}
)
public class HaskellBuildSettings implements PersistentStateComponent<HaskellBuildOptions> {
private HaskellBuildOptions myBuildOptions = new HaskellBuildOptions();
@Nullable
@Override
public HaskellBuildOptions getState() {
return myBuildOptions;
}
@Override
public void loadState(HaskellBuildOptions state) {
myBuildOptions = state;
}
public boolean isCabalEnabled() {
return myBuildOptions.myUseCabal;
}
public void setUseCabal(boolean useCabal) {
myBuildOptions.myUseCabal = useCabal;
}
public boolean isCabalSandboxEnabled() {
return myBuildOptions.myUseCabalSandbox;
}
public void setUseCabalSandbox(boolean useSandbox) {
myBuildOptions.myUseCabalSandbox = useSandbox;
}
public boolean isInstallCabalDependenciesEnabled() {
return myBuildOptions.myInstallCabalDependencies;
}
public boolean isEnableTestsEnabled() {
return myBuildOptions.myEnableTests;
}
public void setInstallCabalDependencies(boolean install) {
myBuildOptions.myInstallCabalDependencies = install;
}
public void setEnableTests(boolean enable) {
myBuildOptions.myEnableTests = enable;
}
public boolean isProfilingEnabled() {
return myBuildOptions.myProfilingBuild;
}
public void setProfilingBuild(boolean useDebugInfo) {
myBuildOptions.myProfilingBuild = useDebugInfo;
}
@NotNull
public String getGhcPath() {
return myBuildOptions.myGhcPath;
}
public void setGhcPath(@NotNull String path) {
myBuildOptions.myGhcPath = path;
}
@NotNull
public String getCabalPath() {
return myBuildOptions.myCabalPath;
}
public void setCabalPath(@NotNull String path) {
myBuildOptions.myCabalPath = path;
}
@NotNull
public String getCabalFlags() {
return myBuildOptions.myCabalFlags;
}
public void setCabalFlags(@NotNull String flags) {
myBuildOptions.myCabalFlags = flags;
}
@NotNull
public List<String> getCabalFiles() {
return myBuildOptions.myCabalFiles;
}
public void setCabalFiles(@NotNull List<String> files) {
myBuildOptions.myCabalFiles = files;
}
public boolean isStackEnabled() {
return myBuildOptions.myUseStack;
}
public void setUseStack(boolean enable) {
myBuildOptions.myUseStack = enable;
}
public String getStackPath() {
return myBuildOptions.myStackPath;
}
public void setStackPath(@NotNull String path) {
myBuildOptions.myStackPath = path;
}
public String getStackFlags() {
return myBuildOptions.myStackFlags;
}
public void setStackFlags(@NotNull String flags) {
myBuildOptions.myStackFlags = flags;
}
public String getStackFile() {
return myBuildOptions.myStackFile;
}
public void setStackFile(@NotNull String file) {
myBuildOptions.myStackFile = file;
}
public void updatePaths() {
myBuildOptions.myGhcPath = guessGhcPath();
myBuildOptions.myCabalPath = guessCabalPath();
myBuildOptions.myStackPath = guessStackPath();
}
public String guessGhcPath() {
String path = myBuildOptions.myGhcPath;
if (path == null || path.isEmpty()) {
String guessed = ExecUtil.locateExecutableByGuessing("ghc");
if (guessed != null) return guessed;
}
return path;
}
public String guessCabalPath() {
String path = myBuildOptions.myCabalPath;
if (path == null || path.isEmpty()) {
String guessed = ExecUtil.locateExecutableByGuessing("cabal");
if (guessed != null) return guessed;
}
return path;
}
public String guessStackPath() {
String path = myBuildOptions.myStackPath;
if (path == null || path.isEmpty()) {
String guessed = ExecUtil.locateExecutableByGuessing("stack");
if (guessed != null) return guessed;
}
return path;
}
@NotNull
public static HaskellBuildSettings getInstance(@NotNull Project project) {
HaskellBuildSettings settings = ServiceManager.getService(project, HaskellBuildSettings.class);
if (settings == null) settings = new HaskellBuildSettings();
settings.updatePaths();
return settings;
}
@NotNull
public static HaskellBuildSettings getDefault() {
return getInstance(ProjectManager.getInstance().getDefaultProject());
}
}