|  | /* | 
|  | * 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.what = work.op; | 
|  | io.why = "Cannot divide by 0"; | 
|  | throw io; | 
|  | } | 
|  | val = work.num1 / work.num2; | 
|  | break; | 
|  | default: | 
|  | auto io = new InvalidOperation(); | 
|  | io.what = 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."); | 
|  | } |