150 lines
3.8 KiB
Dart
150 lines
3.8 KiB
Dart
/// Licensed to the Apache Software Foundation (ASF) under one
|
|
/// or more contributor license agreements. See the NOTICE file
|
|
/// distributed with this work for additional information
|
|
/// regarding copyright ownership. The ASF licenses this file
|
|
/// to you under the Apache License, Version 2.0 (the
|
|
/// "License"); you may not use this file except in compliance
|
|
/// with the License. You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing,
|
|
/// software distributed under the License is distributed on an
|
|
/// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
/// KIND, either express or implied. See the License for the
|
|
/// specific language governing permissions and limitations
|
|
/// under the License.
|
|
|
|
import 'dart:async';
|
|
import 'dart:io';
|
|
|
|
import 'package:args/args.dart';
|
|
import 'package:logging/logging.dart';
|
|
import 'package:thrift/thrift.dart';
|
|
import 'package:thrift/thrift_console.dart';
|
|
import 'package:tutorial/tutorial.dart';
|
|
|
|
TTransport _transport;
|
|
Calculator _calculator;
|
|
int logid = 0;
|
|
|
|
const Map<String, int> operationLookup = const {
|
|
'+': Operation.ADD,
|
|
'-': Operation.SUBTRACT,
|
|
'*': Operation.MULTIPLY,
|
|
'/': Operation.DIVIDE
|
|
};
|
|
|
|
main(List<String> args) {
|
|
Logger.root.level = Level.ALL;
|
|
Logger.root.onRecord.listen((LogRecord rec) {
|
|
print('${rec.level.name}: ${rec.time}: ${rec.message}');
|
|
});
|
|
|
|
var parser = new ArgParser();
|
|
parser.addOption('port', defaultsTo: '9090', help: 'The port to connect to');
|
|
|
|
ArgResults results;
|
|
try {
|
|
results = parser.parse(args);
|
|
} catch (e) {
|
|
results = null;
|
|
}
|
|
|
|
if (results == null) {
|
|
print(parser.usage);
|
|
exit(0);
|
|
}
|
|
|
|
int port = int.parse(results['port']);
|
|
|
|
_initConnection(port).then((_) => _run());
|
|
}
|
|
|
|
Future _initConnection(int port) async {
|
|
var socket = await Socket.connect('127.0.0.1', port);
|
|
_transport = new TAsyncClientSocketTransport(
|
|
new TTcpSocket(socket), new TMessageReader(new TBinaryProtocolFactory()));
|
|
TProtocol protocol = new TBinaryProtocol(_transport);
|
|
await _transport.open();
|
|
|
|
_calculator = new CalculatorClient(protocol);
|
|
}
|
|
|
|
Future _run() async {
|
|
_help();
|
|
|
|
while (true) {
|
|
stdout.write("> ");
|
|
var input = stdin.readLineSync();
|
|
var parts = input.split(' ');
|
|
var command = parts[0];
|
|
var args = parts.length > 1 ? parts.sublist(1) : [];
|
|
|
|
switch (command) {
|
|
case 'ping':
|
|
await _ping();
|
|
break;
|
|
|
|
case 'add':
|
|
await _add(int.parse(args[0]), int.parse(args[1]));
|
|
break;
|
|
|
|
case 'calc':
|
|
int op = operationLookup[args[1]];
|
|
if (!Operation.VALID_VALUES.contains(op)) {
|
|
stdout.writeln('Unknown operator ${args[1]}');
|
|
break;
|
|
}
|
|
|
|
var work = new Work()
|
|
..num1 = int.parse(args[0])
|
|
..op = op
|
|
..num2 = int.parse(args[2])
|
|
..comment = args.length > 3 ? args[3] : '';
|
|
|
|
await _calc(work);
|
|
break;
|
|
|
|
case 'struct':
|
|
await _struct(int.parse(args[0]));
|
|
break;
|
|
|
|
case 'help':
|
|
default:
|
|
_help();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void _help() {
|
|
stdout.writeln('Commands:');
|
|
stdout.writeln(' help');
|
|
stdout.writeln(' ping');
|
|
stdout.writeln(' add x y');
|
|
stdout.writeln(' calc x op y [comment]');
|
|
stdout.writeln(' struct id');
|
|
stdout.writeln('');
|
|
}
|
|
|
|
Future _ping() async {
|
|
await _calculator.ping();
|
|
stdout.writeln('ping succeeded');
|
|
}
|
|
|
|
Future _add(int x, int y) async {
|
|
int result = await _calculator.add(x, y);
|
|
stdout.writeln('= $result');
|
|
}
|
|
|
|
Future _calc(Work work) async {
|
|
int result = await _calculator.calculate(logid++, work);
|
|
stdout.writeln('= $result');
|
|
}
|
|
|
|
Future _struct(int key) async {
|
|
var struct = await _calculator.getStruct(key);
|
|
stdout.writeln(struct.toString());
|
|
}
|