blob: d039183652969c09d463c4355119dbc429dbafef [file] [log] [blame]
// Copyright (c) 2021, 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.
import 'dart:async';
import 'dart:io' as io;
import 'package:dartdoc/dartdoc.dart';
import 'package:dartdoc/options.dart';
import 'package:path/path.dart' as path;
import '../core.dart';
import '../sdk.dart';
/// A command to create a new project from a set of templates.
class DocCommand extends DartdevCommand {
static const String cmdName = 'doc';
DocCommand({bool verbose = false})
: super(
cmdName,
'Generate HTML API documentation from Dart documentation comments.',
verbose,
) {
argParser.addOption(
'output-dir',
abbr: 'o',
defaultsTo: path.join('.', 'doc', 'api'),
help: 'Output directory',
);
argParser.addFlag(
'validate-links',
negatable: true,
help: 'Display context aware warnings for broken links (slow)',
);
}
@override
String get invocation => '${super.invocation} <input directory>';
@override
FutureOr<int> run() async {
// At least one argument, the input directory, is required.
if (argResults.rest.isEmpty) {
usageException("Error: Input directory not specified");
}
// Determine input directory.
final dir = io.Directory(argResults.rest[0]);
if (!dir.existsSync()) {
usageException("Error: Input directory doesn't exist: ${dir.path}");
}
// Parse options.
final options = [
'--input=${dir.path}',
'--output=${argResults['output-dir']}',
];
if (argResults['validate-links']) {
options.add('--validate-links');
} else {
options.add('--no-validate-links');
}
// Specify where dartdoc resources are located.
final resourcesPath =
path.absolute(sdk.sdkPath, 'bin', 'resources', 'dartdoc', 'resources');
options.add('--resources-dir=$resourcesPath');
final config = await parseOptions(pubPackageMetaProvider, options);
if (config == null) {
// There was an error while parsing options.
return 2;
}
// Call dartdoc.
if (verbose) {
log.stdout('Calling dartdoc with the following options: $options');
}
final packageConfigProvider = PhysicalPackageConfigProvider();
final packageBuilder = PubPackageBuilder(
config, pubPackageMetaProvider, packageConfigProvider);
final dartdoc = config.generateDocs
? await Dartdoc.fromContext(config, packageBuilder)
: await Dartdoc.withEmptyGenerator(config, packageBuilder);
dartdoc.executeGuarded();
return 0;
}
}