blob: d43aeaaeb375c0acfcdc6a2d5aca9f05939ac4c7 [file] [log] [blame]
/*
* Copyright 2016 The Bazel Authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.idea.blaze.base.command;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.idea.blaze.base.model.primitives.TargetExpression;
import java.util.Arrays;
import java.util.List;
import javax.annotation.concurrent.Immutable;
/** A command to issue to Blaze/Bazel on the command line. */
@Immutable
public final class BlazeCommand {
private final String binaryPath;
private final BlazeCommandName name;
private final ImmutableList<String> arguments;
private BlazeCommand(String binaryPath, BlazeCommandName name, ImmutableList<String> arguments) {
this.binaryPath = binaryPath;
this.name = name;
this.arguments = arguments;
}
public BlazeCommandName getName() {
return name;
}
public ImmutableList<String> toList() {
return ImmutableList.<String>builder()
.add(binaryPath)
.add(name.toString())
.addAll(arguments)
.build();
}
@Override
public String toString() {
return Joiner.on(' ').join(toList());
}
public static Builder builder(String binaryPath, BlazeCommandName name) {
return new Builder(binaryPath, name);
}
/** Builder for a blaze command */
public static class Builder {
private final String binaryPath;
private final BlazeCommandName name;
private final ImmutableList.Builder<TargetExpression> targets = ImmutableList.builder();
private final ImmutableList.Builder<String> blazeFlags = ImmutableList.builder();
private final ImmutableList.Builder<String> exeFlags = ImmutableList.builder();
public Builder(String binaryPath, BlazeCommandName name) {
this.binaryPath = binaryPath;
this.name = name;
// Tell forge what tool we used to call blaze so we can track usage.
addBlazeFlags(BlazeFlags.getToolTagFlag());
}
public BlazeCommand build() {
ImmutableList.Builder<String> arguments = ImmutableList.builder();
arguments.addAll(blazeFlags.build());
arguments.add("--");
// Trust the user's ordering of the targets since order matters to blaze
for (TargetExpression targetExpression : targets.build()) {
arguments.add(targetExpression.toString());
}
arguments.addAll(exeFlags.build());
return new BlazeCommand(binaryPath, name, arguments.build());
}
public Builder addTargets(TargetExpression... targets) {
return this.addTargets(Arrays.asList(targets));
}
public Builder addTargets(List<? extends TargetExpression> targets) {
this.targets.addAll(targets);
return this;
}
public Builder addExeFlags(String... flags) {
return addExeFlags(Arrays.asList(flags));
}
public Builder addExeFlags(List<String> flags) {
this.exeFlags.addAll(flags);
return this;
}
public Builder addBlazeFlags(String... flags) {
return addBlazeFlags(Arrays.asList(flags));
}
public Builder addBlazeFlags(List<String> flags) {
this.blazeFlags.addAll(flags);
return this;
}
}
}