// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library directory_validator;

import 'dart:async';

import '../../../pkg/path/lib/path.dart' as path;

import '../entrypoint.dart';
import '../io.dart';
import '../utils.dart';
import '../validator.dart';

/// A validator that validates a package's top-level directories.
class DirectoryValidator extends Validator {
  DirectoryValidator(Entrypoint entrypoint)
    : super(entrypoint);

  static final _PLURAL_NAMES = ["tools", "tests", "docs", "examples"];

  Future validate() {
    return listDir(entrypoint.root.dir).then((dirs) {
      for (var dir in dirs) {
        if (!dirExists(dir)) continue;

        dir = path.basename(dir);
        if (_PLURAL_NAMES.contains(dir)) {
          // Cut off the "s"
          var singularName = dir.substring(0, dir.length - 1);
          warnings.add('Rename the top-level "$dir" directory to '
                  '"$singularName".\n'
              'The Pub layout convention is to use singular directory '
                  'names.\n'
              'Plural names won\'t be correctly identified by Pub and other '
                  'tools.');
        }

        if (dir.contains(new RegExp(r"^samples?$"))) {
          warnings.add('Rename the top-level "$dir" directory to "example".\n'
              'This allows Pub to find your examples and create "packages" '
                  'directories for them.\n');
        }
      }
    });
  }
}
