blob: e2954c273605ffec26786c2cdd40d2a209924859 [file] [log] [blame]
// 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.
/// An implementation of the calculator protocol.
#include "engine_driver.h"
#include <lib/sys/cpp/component_context.h>
namespace calculator_engine {
namespace calculator = ::fuchsia::examples::calculator;
Engine::Engine() : Engine(sys::ComponentContext::CreateAndServeOutgoingDirectory()) {}
Engine::Engine(std::unique_ptr<sys::ComponentContext> context) : context_(std::move(context)) {
context_->outgoing()->AddPublicService(bindings_.GetHandler(this));
}
void Engine::DoUnaryOp(calculator::UnaryOp op, double a, DoUnaryOpCallback callback) {
switch (op) {
case calculator::UnaryOp::NEGATION:
callback(calculator::Result::WithNumber(a - a - a));
break;
default:
calculator::Error error;
error.message = "invalid operation";
callback(calculator::Result::WithError(std::move(error)));
break;
}
}
void Engine::DoBinaryOp(calculator::BinaryOp op, double a, double b, DoBinaryOpCallback callback) {
switch (op) {
case calculator::BinaryOp::ADDITION:
callback(calculator::Result::WithNumber(add(a, b)));
break;
case calculator::BinaryOp::SUBTRACTION:
callback(calculator::Result::WithNumber(subtract(a, b)));
break;
case calculator::BinaryOp::MULTIPLICATION:
callback(calculator::Result::WithNumber(multiply(a, b)));
break;
case calculator::BinaryOp::DIVISION:
callback(calculator::Result::WithNumber(divide(a, b)));
break;
default:
calculator::Error error;
error.message = "invalid operation";
callback(calculator::Result::WithError(std::move(error)));
break;
}
}
} // namespace calculator_engine