/// 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 operationLookup = const { '+': Operation.ADD, '-': Operation.SUBTRACT, '*': Operation.MULTIPLY, '/': Operation.DIVIDE }; main(List 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()); }