// Copyright 2014 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.model;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.PathUtil;
import com.twitter.intellij.pants.util.PantsUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Optional;
public class PantsTargetAddress {
private final String myPath;
private final String myTargetName;
public PantsTargetAddress(@NotNull String path, @NotNull String name) {
myPath = path;
myTargetName = name;
}
/**
* @return relative or absolute path depending on how it was created. Suitable for both cases.
*/
@NotNull
public String getPath() {
return myPath;
}
@NotNull
public String getRelativePath() {
final Optional<File> buildRoot = PantsUtil.findBuildRoot(new File(getPath()));
return buildRoot
.flatMap(file -> PantsUtil.getRelativeProjectPath(file, getPath()))
.orElse(getPath());
}
@NotNull
public String getTargetName() {
return myTargetName;
}
@Override
public String toString() {
return myPath + ":" + myTargetName;
}
@NotNull
public static PantsTargetAddress fromString(@NotNull @NonNls String targetName) {
final Optional<PantsTargetAddress> result = fromString(targetName, false);
assert result.isPresent();
return result.get();
}
public boolean isMainTarget() {
return StringUtil.equals(PathUtil.getFileName(getPath()), getTargetName());
}
/**
* @param strict - if <code>true</code> the method will return <code>Optional.empty()</code> if there is no <code>:</code> indicating a target name.
*/
public static Optional<PantsTargetAddress> fromString(@NotNull @NonNls String targetPath, boolean strict) {
final int index = targetPath.lastIndexOf(':');
if (index < 0) {
return strict ? Optional.empty() : Optional.of(new PantsTargetAddress(targetPath, PathUtil.getFileName(targetPath)));
} else {
final String path = targetPath.substring(0, index);
final String name = targetPath.substring(index + 1);
return Optional.of(new PantsTargetAddress(path, StringUtil.isEmpty(name) ? PathUtil.getFileName(path) : name));
}
}
public static Optional<String> extractPath(@Nullable String address) {
if (StringUtil.isEmpty(address)) {
return Optional.empty();
}
final int index = address.lastIndexOf(':');
return Optional.of(index < 0 ? address : address.substring(0, index));
}
}