/*
 * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
 * (the "License"). You may not use this work except in compliance with the License, which is
 * available at www.apache.org/licenses/LICENSE-2.0
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied, as more fully set forth in the License.
 *
 * See the NOTICE file distributed with this work for information regarding copyright ownership.
 */

package alluxio.underfs;

import alluxio.file.options.DescendantType;

import java.util.function.Consumer;
import javax.annotation.Nullable;

/**
 * The async UFS client interface.
 */
public interface AsyncUfsClient {

  /**
   * Lists the ufs statuses for a given path. The {@link UfsStatus#getName()}
   * function for the returned values should include the full path of each
   * item from the UFS root (not including the bucket name for object stores).
   * It differs from a traditional listing in that if the input variable
   * checkStatus is true, the {@link UfsStatus} for the base path should
   * be included at the start of the results. The function should return
   * immediately, and perform the operation asynchronously.
   * @param path the path in ufs
   * @param continuationToken the continuation token
   * @param startAfter the start after string where the loading starts from
   * @param descendantType the load descendant type (NONE/ONE/ALL)
   * @param checkStatus if true the call will perform a GetStatus on the path
   *                    to see if an object exists, which should be returned
   *                    as part of the result
   * @param onComplete the callback when the load is complete
   * @param onError the callback when the load encountered an error
   */
  void performListingAsync(
      String path, @Nullable String continuationToken, @Nullable String startAfter,
      DescendantType descendantType, boolean checkStatus, Consumer<UfsLoadResult> onComplete,
      Consumer<Throwable> onError);
}
