// 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 lib_validator;

import 'dart:async';
import 'dart:io';

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

import '../entrypoint.dart';
import '../io.dart';
import '../system_cache.dart';
import '../utils.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() {
    var libDir = path.join(entrypoint.root.dir, "lib");

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

      return listDir(libDir).then((files) {
        files = files.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.");
        }
      });
    });
  }
}
