open Thrift
open ThriftTest_types

let p = Printf.printf;;
exception Die;;
let sod = function
    Some v -> v
  | None -> raise Die;;


class test_handler =
object (self)
  inherit ThriftTest.iface
  method testVoid = p "testVoid()\n"
  method testString x = p "testString(%s)\n" (sod x); (sod x)
  method testByte x = p "testByte(%d)\n" (sod x); (sod x)
  method testI32 x = p "testI32(%d)\n" (sod x); (sod x)
  method testI64 x = p "testI64(%s)\n" (Int64.to_string (sod x)); (sod x)
  method testDouble x = p "testDouble(%f)\n" (sod x); (sod x)
  method testStruct x = p "testStruct(---)\n"; (sod x)
  method testNest x = p "testNest(---)\n"; (sod x)
  method testMap x = p "testMap(---)\n"; (sod x)
  method testSet x = p "testSet(---)\n"; (sod x)
  method testList x = p "testList(---)\n"; (sod x)
  method testEnum x = p "testEnum(---)\n"; (sod x)
  method testTypedef x = p "testTypedef(---)\n"; (sod x)
  method testMapMap x = p "testMapMap(%d)\n" (sod x); 
    let mm = Hashtbl.create 3 in
    let pos = Hashtbl.create 7 in
    let neg = Hashtbl.create 7 in
      for i=1 to 4 do
        Hashtbl.add pos i i;
        Hashtbl.add neg (-i) (-i);
      done;
      Hashtbl.add mm 4 pos;
      Hashtbl.add mm (-4) neg;
      mm
  method testInsanity x = p "testInsanity()\n";
    p "testinsanity()\n";
    let hello = new xtruct in
    let goodbye = new xtruct in
    let crazy = new insanity in
    let looney = new insanity in
    let cumap = Hashtbl.create 7 in
    let insane = Hashtbl.create 7 in
    let firstmap = Hashtbl.create 7 in
    let secondmap = Hashtbl.create 7 in
      hello#set_string_thing "Hello2";
      hello#set_byte_thing 2;
      hello#set_i32_thing 2;
      hello#set_i64_thing 2L;
      goodbye#set_string_thing "Goodbye4";
      goodbye#set_byte_thing 4;
      goodbye#set_i32_thing 4;
      goodbye#set_i64_thing 4L;
      Hashtbl.add cumap Numberz.EIGHT 8L;
      Hashtbl.add cumap Numberz.FIVE 5L;
      crazy#set_userMap cumap;
      crazy#set_xtructs [goodbye; hello];
      Hashtbl.add firstmap Numberz.TWO crazy;
      Hashtbl.add firstmap Numberz.THREE crazy;
      Hashtbl.add secondmap Numberz.SIX looney;
      Hashtbl.add insane 1L firstmap;
      Hashtbl.add insane 2L secondmap;
      insane
  method testMulti a0 a1 a2 a3 a4 a5 = 
    p "testMulti()\n";
    let hello = new xtruct in
      hello#set_string_thing "Hello2";
      hello#set_byte_thing (sod a0);
      hello#set_i32_thing (sod a1);
      hello#set_i64_thing (sod a2);
      hello
  method testException s =
    p "testException(%S)\n" (sod s);
    if (sod s) = "Xception" then
      let x = new xception in
        x#set_errorCode 1001;
        x#set_message "This is an Xception";
        raise (Xception x)
    else ()
  method testMultiException a0 a1 =
    p "testMultiException(%S, %S)\n" (sod a0) (sod a1);
    if (sod a0) = "Xception" then
      let x = new xception in
        x#set_errorCode 1001;
        x#set_message "This is an Xception";
        raise (Xception x)
    else (if (sod a0) = "Xception2" then
              let x = new xception2 in
              let s = new xtruct in
                x#set_errorCode 2002;
                s#set_string_thing "This as an Xception2";
                x#set_struct_thing s;
                raise (Xception2 x)
          else ());
    let res = new xtruct in
      res#set_string_thing (sod a1);
      res
end;;

let h = new test_handler in
let proc = new ThriftTest.processor h in
let port = 9090 in
let pf = new TBinaryProtocol.factory in
let server = new TThreadedServer.t 
  proc 
  (new TServerSocket.t port) 
  (new Transport.factory) 
  pf 
  pf 
in
  server#serve
                                             
                                 
