export function findFilesAndDirectories()

in src/file-finder.ts [29:105]


export function findFilesAndDirectories(
  directoryOrFileToScan: File.AbsoluteFilePath,
  fileExtension: string,
): Promise.Future<Either.Either<Error.Error, FilesAndDirectories>> {
  const promise =
    Promise.pending<Either.Either<Error.Error, FilesAndDirectories>>();
  const fileExtensionPath: string = '.' + fileExtension;
  const absolutePath: string = File.getAbsolutePathString(
    directoryOrFileToScan,
  );
  if (pathIsToFileWithExtensionType(fileExtensionPath, absolutePath)) {
    fs.stat(absolutePath, function (err, stats) {
      if (err) {
        const message = absolutePath + ' does not exist';
        promise.setValue(
          Either.Left<Error.Error, FilesAndDirectories>(Error.Error(message)),
        );
      } else {
        const result: FilesAndDirectories = {
          foundPotentialDirectories: [],
          foundFilePaths: [directoryOrFileToScan],
        };
        promise.setValue(
          Either.Right<Error.Error, FilesAndDirectories>(result),
        );
      }
    });
  } else {
    fs.readdir(
      File.getAbsolutePathString(directoryOrFileToScan),
      function (err, files) {
        if (err) {
          promise.setValue(
            Either.Left<Error.Error, FilesAndDirectories>(
              Error.Error(err.message),
            ),
          );
        } else {
          const stats = files.reduce(
            function (
              soFar: FilesAndDirectories,
              str: string,
            ): FilesAndDirectories {
              const fullPath: File.AbsoluteFilePath =
                PathUtils.getAbsolutePathFromDirectoryAndRelativePath(
                  directoryOrFileToScan,
                  str,
                );
              const indexOfPeriod = str.indexOf('.');
              if (indexOfPeriod === -1) {
                soFar.foundPotentialDirectories.push(fullPath);
                return soFar;
              } else if (indexOfPeriod === 0) {
                return soFar;
              } else {
                if (
                  str.indexOf(
                    fileExtensionPath,
                    str.length - fileExtensionPath.length,
                  ) !== -1
                ) {
                  soFar.foundFilePaths.push(fullPath);
                }
                return soFar;
              }
            },
            {foundPotentialDirectories: [], foundFilePaths: []},
          );
          promise.setValue(
            Either.Right<Error.Error, FilesAndDirectories>(stats),
          );
        }
      },
    );
  }
  return promise.getFuture();
}