blob: 911cbc66883a2ee7163b96bdd49b7075f4554b03 [file] [log] [blame]
// Copyright (c) 2014, 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 driver;
import 'dart:io';
import 'package:analysis_server/http_server.dart';
import 'package:analysis_server/src/socket_server.dart';
import 'package:analysis_server/stdio_server.dart';
import 'package:args/args.dart';
/**
* The [Driver] class represents a single running instance of the analysis
* server application. It is responsible for parsing command line options
* and starting the HTTP and/or stdio servers.
*/
class Driver {
/**
* The name of the application that is used to start a server.
*/
static const BINARY_NAME = 'server';
/**
* The name of the option used to print usage information.
*/
static const String HELP_OPTION = "help";
/**
* The name of the option used to specify the port to which the server will
* connect.
*/
static const String PORT_OPTION = "port";
SocketServer socketServer = new SocketServer();
HttpAnalysisServer httpServer;
StdioAnalysisServer stdioServer;
Driver() {
httpServer = new HttpAnalysisServer(socketServer);
stdioServer = new StdioAnalysisServer(socketServer);
}
/**
* Use the given command-line arguments to start this server.
*/
void start(List<String> args) {
ArgParser parser = new ArgParser();
parser.addFlag(HELP_OPTION, help:
"print this help message without starting a server", defaultsTo: false,
negatable: false);
parser.addOption(PORT_OPTION, help:
"[port] the port on which the server will listen");
ArgResults results = parser.parse(args);
if (results[HELP_OPTION]) {
_printUsage(parser);
return;
}
int port;
bool serve_http = false;
if (results[PORT_OPTION] != null) {
serve_http = true;
try {
port = int.parse(results[PORT_OPTION]);
} on FormatException {
print('Invalid port number: ${results[PORT_OPTION]}');
print('');
_printUsage(parser);
exitCode = 1;
return;
}
}
if (serve_http) {
httpServer.serveHttp(port);
}
stdioServer.serveStdio().then((_) {
if (serve_http) {
httpServer.close();
}
});
}
/**
* Print information about how to use the server.
*/
void _printUsage(ArgParser parser) {
print('Usage: $BINARY_NAME [flags]');
print('');
print('Supported flags are:');
print(parser.getUsage());
}
}