/*
 * 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.util;

import com.google.common.base.Predicate;

import java.io.File;
import java.util.Map;

public interface FilteredDirectoryCopier {

  /**
   * Copies multiple directories while filtering out individual files which fail a predicate.
   * @param sourcesToDestinations mapping from source to destination directories
   * @param pred predicate to test against
   */
  public abstract void copyDirs(Map<String, String> sourcesToDestinations,
      Predicate<File> pred,
      ProcessExecutor processExecutor);

  /**
   * Creates a filtered copy of a directory.
   * @param srcDir source directory
   * @param destDir destination directory
   * @param pred a predicate to determine which files should be copied.
   */
  public abstract void copyDir(
      String srcDir,
      String destDir,
      Predicate<File> pred,
      ProcessExecutor processExecutor);

}
