| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| /// A tool that connects to a calculator engine over FIDL to perform |
| /// arithmetic operations. |
| #include <fuchsia/examples/calculator/cpp/fidl.h> |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/async-loop/default.h> |
| |
| #include <iostream> |
| #include <string> |
| |
| #include "client.h" |
| |
| namespace calculator = fuchsia::examples::calculator; |
| |
| namespace calculator_cli { |
| |
| /// Structured request parameters for Calculator interface |
| struct Request { |
| int a; |
| int b; |
| calculator::BinaryOp op; |
| }; |
| |
| std::ostream& operator << (std::ostream& os, const Request& arg) |
| { |
| os << arg.a; |
| switch (arg.op) { |
| case calculator::BinaryOp::ADDITION: |
| os << " + "; |
| break; |
| case calculator::BinaryOp::SUBTRACTION: |
| os << " - "; |
| break; |
| case calculator::BinaryOp::MULTIPLICATION: |
| os << " x "; |
| break; |
| case calculator::BinaryOp::DIVISION: |
| os << " / "; |
| break; |
| } |
| os << arg.b; |
| return os; |
| } |
| |
| } // namespace calculator_cli |
| |
| /// Entry point for the calculator CLI. |
| int main(int argc, char **argv) { |
| async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread); |
| calculator_cli::CalculatorClient app; |
| app.Start(); |
| |
| // 2 + 2 = ? |
| calculator_cli::Request args = { |
| 2, 2, |
| calculator::BinaryOp::ADDITION, |
| }; |
| std::cout << "Request: " << args << std::endl; |
| |
| app.calculator()->DoBinaryOp(args.op, args.a, args.b, [&loop](calculator::Result value) { |
| if (value.is_error()) { |
| std::cerr << "Error: " << value.error().message << std::endl; |
| } else { |
| std::cout << "Result: " << value.number() << std::endl; |
| } |
| loop.Quit(); |
| }); |
| return loop.Run(); |
| } |