|  | #!/usr/bin/env ruby | 
|  |  | 
|  | $:.push('../gen-rb') | 
|  | $:.unshift '../../lib/rb/lib' | 
|  |  | 
|  | require 'thrift' | 
|  | require 'thrift/protocol/binaryprotocol' | 
|  | require 'thrift/server/tserver' | 
|  |  | 
|  | require 'Calculator' | 
|  | require 'shared_types' | 
|  |  | 
|  | class CalculatorHandler | 
|  | def initialize() | 
|  | @log = {} | 
|  | end | 
|  |  | 
|  | def ping() | 
|  | puts "ping()" | 
|  | end | 
|  |  | 
|  | def add(n1, n2) | 
|  | print "add(", n1, ",", n2, ")\n" | 
|  | return n1 + n2 | 
|  | end | 
|  |  | 
|  | def calculate(logid, work) | 
|  | print "calculate(", logid, ", {", work.op, ",", work.num1, ",", work.num2,"})\n" | 
|  | if work.op == Operation::ADD | 
|  | val = work.num1 + work.num2 | 
|  | elsif work.op == Operation::SUBTRACT | 
|  | val = work.num1 - work.num2 | 
|  | elsif work.op == Operation::MULTIPLY | 
|  | val = work.num1 * work.num2 | 
|  | elsif work.op == Operation::DIVIDE | 
|  | if work.num2 == 0 | 
|  | x = InvalidOperation.new() | 
|  | x.what = work.op | 
|  | x.why = "Cannot divide by 0" | 
|  | raise x | 
|  | end | 
|  | val = work.num1 / work.num2 | 
|  | else | 
|  | x = InvalidOperation.new() | 
|  | x.what = work.op | 
|  | x.why = "Invalid operation" | 
|  | raise x | 
|  | end | 
|  |  | 
|  | entry = SharedStruct.new() | 
|  | entry.key = logid | 
|  | entry.value = "#{val}" | 
|  | @log[logid] = entry | 
|  |  | 
|  | return val | 
|  |  | 
|  | end | 
|  |  | 
|  | def getStruct(key) | 
|  | print "getStruct(", key, ")\n" | 
|  | return @log[key] | 
|  | end | 
|  |  | 
|  | def zip() | 
|  | print "zip\n" | 
|  | end | 
|  |  | 
|  | end | 
|  |  | 
|  | handler = CalculatorHandler.new() | 
|  | processor = Calculator::Processor.new(handler) | 
|  | transport = Thrift::ServerSocket.new(9090) | 
|  | transportFactory = Thrift::BufferedTransportFactory.new() | 
|  | server = Thrift::SimpleServer.new(processor, transport, transportFactory) | 
|  |  | 
|  | puts "Starting the server..." | 
|  | server.serve() | 
|  | puts "done." |