/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.facebook.buck.cli;

import com.google.common.collect.Lists;

import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.Option;

import java.util.List;

public class CleanCommandOptions extends AbstractCommandOptions {

  CleanCommandOptions(BuckConfig buckConfig) {
    super(buckConfig);
  }

  @Option(
      name = "--project",
      aliases = { "-p" },
      usage = "Delete files generated by `buck project`.")
  private boolean isCleanBuckProjectFiles = false;

  @Argument
  private List<String> arguments = Lists.newArrayList();

  public List<String> getArguments() {
    return arguments;
  }

  public boolean isCleanBuckProjectFiles() {
    return isCleanBuckProjectFiles;
  }
}
