// 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 pub.validator.lib;

import 'dart:async';

import 'package:path/path.dart' as path;

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

// TODO(nweiz): When issue 7196 is fixed, complain about non-Dart files in lib.
/// A validator that checks that libraries in "lib/" (and not "lib/src/") exist
/// and are well-formed.
class LibValidator extends Validator {
  LibValidator(Entrypoint entrypoint)
    : super(entrypoint);

  Future validate() {
    return new Future.sync(() {
      var libDir = path.join(entrypoint.root.dir, "lib");

      if (!dirExists(libDir)) {
        errors.add('You must have a "lib" directory.\n'
            "Without that, users cannot import any code from your package.");
        return;
      }

      var files = listDir(libDir)
          .map((file) => path.relative(file, from: libDir))
          .toList();
      if (files.isEmpty) {
        errors.add('You must have a non-empty "lib" directory.\n'
            "Without that, users cannot import any code from your package.");
      } else if (files.length == 1 && files.first == "src") {
        errors.add('The "lib" directory must contain something other than '
            '"src".\n'
            "Otherwise, users cannot import any code from your package.");
      }
    });
  }
}
