/*
 * 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.io.IOException;
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) throws IOException;

  /**
   * 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) throws IOException;

}
