blob: fda206ab9b5eb26483fa95397ff0d44f6d7d91fc [file] [log] [blame]
/// 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());
}