blob: cbcedccf33a7d408b6fb1f5bbf8dfc2d01f9ae2d [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.
*/
module server;
import std.conv : to;
import std.stdio;
import thrift.codegen.processor;
import thrift.protocol.binary;
import thrift.server.simple;
import thrift.server.transport.socket;
import thrift.transport.buffered;
import share.SharedService;
import share.shared_types;
import tutorial.Calculator;
import tutorial.tutorial_types;
/**
* The actual implementation of the Calculator interface that is called by
* the server to answer the requests.
*/
class CalculatorHandler : Calculator {
void ping() {
writeln("ping()");
}
int add(int n1, int n2) {
writefln("add(%s,%s)", n1, n2);
return n1 + n2;
}
int calculate(int logid, ref const(Work) work) {
writefln("calculate(%s, {%s, %s, %s})", logid, work.op, work.num1, work.num2);
int val;
switch (work.op) {
case Operation.ADD:
val = work.num1 + work.num2;
break;
case Operation.SUBTRACT:
val = work.num1 - work.num2;
break;
case Operation.MULTIPLY:
val = work.num1 * work.num2;
break;
case Operation.DIVIDE:
if (work.num2 == 0) {
auto io = new InvalidOperation();
io.whatOp = work.op;
io.why = "Cannot divide by 0";
throw io;
}
val = work.num1 / work.num2;
break;
default:
auto io = new InvalidOperation();
io.whatOp = work.op;
io.why = "Invalid Operation";
throw io;
}
auto ss = SharedStruct();
ss.key = logid;
ss.value = to!string(val);
log[logid] = ss;
return val;
}
SharedStruct getStruct(int logid) {
writefln("getStruct(%s)", logid);
return log[logid];
}
void zip() {
writeln("zip()");
}
protected:
SharedStruct[int] log;
}
void main() {
auto protocolFactory = new TBinaryProtocolFactory!();
auto processor = new TServiceProcessor!Calculator(new CalculatorHandler);
auto serverTransport = new TServerSocket(9090);
auto transportFactory = new TBufferedTransportFactory;
auto server = new TSimpleServer(
processor, serverTransport, transportFactory, protocolFactory);
writeln("Starting the server on port 9090...");
server.serve();
writeln("done.");
}