auser-poolparty 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (353) hide show
  1. data/VERSION.yml +1 -1
  2. data/examples/monitored_cloud.rb +1 -1
  3. data/examples/thrift/thrift_example.rb +1 -1
  4. data/lib/proto/command_interface_handler.rb +1 -1
  5. data/vendor/gems/thrift/CHANGES +35 -0
  6. data/vendor/gems/thrift/CONTRIBUTORS +77 -0
  7. data/vendor/gems/thrift/DISCLAIMER +6 -0
  8. data/vendor/gems/thrift/LICENSE +202 -0
  9. data/vendor/gems/thrift/Makefile.am +28 -0
  10. data/vendor/gems/thrift/NEWS +79 -0
  11. data/vendor/gems/thrift/NOTICE +26 -0
  12. data/vendor/gems/thrift/README +137 -0
  13. data/vendor/gems/thrift/aclocal/ax_boost_base.m4 +198 -0
  14. data/vendor/gems/thrift/aclocal/ax_javac_and_java.m4 +107 -0
  15. data/vendor/gems/thrift/aclocal/ax_lib_event.m4 +194 -0
  16. data/vendor/gems/thrift/aclocal/ax_lib_zlib.m4 +173 -0
  17. data/vendor/gems/thrift/aclocal/ax_signed_right_shift.m4 +127 -0
  18. data/vendor/gems/thrift/aclocal/ax_thrift_internal.m4 +39 -0
  19. data/vendor/gems/thrift/bootstrap.sh +35 -0
  20. data/vendor/gems/thrift/cleanup.sh +58 -0
  21. data/vendor/gems/thrift/compiler/cpp/Makefile.am +136 -0
  22. data/vendor/gems/thrift/compiler/cpp/README +39 -0
  23. data/vendor/gems/thrift/compiler/cpp/src/generate/t_cocoa_generator.cc +2331 -0
  24. data/vendor/gems/thrift/compiler/cpp/src/generate/t_cpp_generator.cc +3003 -0
  25. data/vendor/gems/thrift/compiler/cpp/src/generate/t_csharp_generator.cc +1700 -0
  26. data/vendor/gems/thrift/compiler/cpp/src/generate/t_erl_generator.cc +932 -0
  27. data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.cc +173 -0
  28. data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.h +321 -0
  29. data/vendor/gems/thrift/compiler/cpp/src/generate/t_hs_generator.cc +1445 -0
  30. data/vendor/gems/thrift/compiler/cpp/src/generate/t_html_generator.cc +637 -0
  31. data/vendor/gems/thrift/compiler/cpp/src/generate/t_java_generator.cc +3069 -0
  32. data/vendor/gems/thrift/compiler/cpp/src/generate/t_ocaml_generator.cc +1673 -0
  33. data/vendor/gems/thrift/compiler/cpp/src/generate/t_oop_generator.h +77 -0
  34. data/vendor/gems/thrift/compiler/cpp/src/generate/t_perl_generator.cc +1812 -0
  35. data/vendor/gems/thrift/compiler/cpp/src/generate/t_php_generator.cc +2281 -0
  36. data/vendor/gems/thrift/compiler/cpp/src/generate/t_py_generator.cc +2310 -0
  37. data/vendor/gems/thrift/compiler/cpp/src/generate/t_rb_generator.cc +1114 -0
  38. data/vendor/gems/thrift/compiler/cpp/src/generate/t_st_generator.cc +1071 -0
  39. data/vendor/gems/thrift/compiler/cpp/src/generate/t_xsd_generator.cc +354 -0
  40. data/vendor/gems/thrift/compiler/cpp/src/globals.h +117 -0
  41. data/vendor/gems/thrift/compiler/cpp/src/main.cc +1207 -0
  42. data/vendor/gems/thrift/compiler/cpp/src/main.h +103 -0
  43. data/vendor/gems/thrift/compiler/cpp/src/md5.c +381 -0
  44. data/vendor/gems/thrift/compiler/cpp/src/md5.h +91 -0
  45. data/vendor/gems/thrift/compiler/cpp/src/parse/t_base_type.h +137 -0
  46. data/vendor/gems/thrift/compiler/cpp/src/parse/t_const.h +59 -0
  47. data/vendor/gems/thrift/compiler/cpp/src/parse/t_const_value.h +121 -0
  48. data/vendor/gems/thrift/compiler/cpp/src/parse/t_container.h +56 -0
  49. data/vendor/gems/thrift/compiler/cpp/src/parse/t_doc.h +51 -0
  50. data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum.h +59 -0
  51. data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum_value.h +64 -0
  52. data/vendor/gems/thrift/compiler/cpp/src/parse/t_field.h +150 -0
  53. data/vendor/gems/thrift/compiler/cpp/src/parse/t_function.h +93 -0
  54. data/vendor/gems/thrift/compiler/cpp/src/parse/t_list.h +56 -0
  55. data/vendor/gems/thrift/compiler/cpp/src/parse/t_map.h +64 -0
  56. data/vendor/gems/thrift/compiler/cpp/src/parse/t_program.h +223 -0
  57. data/vendor/gems/thrift/compiler/cpp/src/parse/t_scope.h +86 -0
  58. data/vendor/gems/thrift/compiler/cpp/src/parse/t_service.h +68 -0
  59. data/vendor/gems/thrift/compiler/cpp/src/parse/t_set.h +55 -0
  60. data/vendor/gems/thrift/compiler/cpp/src/parse/t_struct.h +127 -0
  61. data/vendor/gems/thrift/compiler/cpp/src/parse/t_type.h +176 -0
  62. data/vendor/gems/thrift/compiler/cpp/src/parse/t_typedef.h +70 -0
  63. data/vendor/gems/thrift/compiler/cpp/src/platform.h +36 -0
  64. data/vendor/gems/thrift/compiler/cpp/src/thriftl.ll +303 -0
  65. data/vendor/gems/thrift/compiler/cpp/src/thrifty.yy +1140 -0
  66. data/vendor/gems/thrift/configure.ac +255 -0
  67. data/vendor/gems/thrift/contrib/fb303/LICENSE +16 -0
  68. data/vendor/gems/thrift/contrib/fb303/Makefile.am +31 -0
  69. data/vendor/gems/thrift/contrib/fb303/README +37 -0
  70. data/vendor/gems/thrift/contrib/fb303/acinclude.m4 +258 -0
  71. data/vendor/gems/thrift/contrib/fb303/aclocal/ax_boost_base.m4 +198 -0
  72. data/vendor/gems/thrift/contrib/fb303/bootstrap.sh +26 -0
  73. data/vendor/gems/thrift/contrib/fb303/configure.ac +115 -0
  74. data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.cpp +124 -0
  75. data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.h +103 -0
  76. data/vendor/gems/thrift/contrib/fb303/cpp/Makefile.am +84 -0
  77. data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.cpp +481 -0
  78. data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.h +215 -0
  79. data/vendor/gems/thrift/contrib/fb303/global_footer.mk +21 -0
  80. data/vendor/gems/thrift/contrib/fb303/global_header.mk +38 -0
  81. data/vendor/gems/thrift/contrib/fb303/if/fb303.thrift +112 -0
  82. data/vendor/gems/thrift/contrib/fb303/java/FacebookBase.java +103 -0
  83. data/vendor/gems/thrift/contrib/fb303/java/build.xml +84 -0
  84. data/vendor/gems/thrift/contrib/fb303/php/FacebookBase.php +89 -0
  85. data/vendor/gems/thrift/contrib/fb303/py/Makefile.am +44 -0
  86. data/vendor/gems/thrift/contrib/fb303/py/fb303/FacebookBase.py +82 -0
  87. data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/__init__.py +20 -0
  88. data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py +195 -0
  89. data/vendor/gems/thrift/contrib/fb303/py/setup.py +27 -0
  90. data/vendor/gems/thrift/contrib/thrift.el +126 -0
  91. data/vendor/gems/thrift/contrib/thrift.spec +206 -0
  92. data/vendor/gems/thrift/contrib/thrift.vim +91 -0
  93. data/vendor/gems/thrift/contrib/thrift_dump.cpp +91 -0
  94. data/vendor/gems/thrift/doc/lgpl-2.1.txt +504 -0
  95. data/vendor/gems/thrift/doc/otp-base-license.txt +20 -0
  96. data/vendor/gems/thrift/doc/thrift.bnf +96 -0
  97. data/vendor/gems/thrift/doc/thrift.tex +1057 -0
  98. data/vendor/gems/thrift/lib/Makefile.am +55 -0
  99. data/vendor/gems/thrift/lib/cocoa/README +21 -0
  100. data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.h +44 -0
  101. data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.m +130 -0
  102. data/vendor/gems/thrift/lib/cocoa/src/TException.h +34 -0
  103. data/vendor/gems/thrift/lib/cocoa/src/TException.m +64 -0
  104. data/vendor/gems/thrift/lib/cocoa/src/TProcessor.h +29 -0
  105. data/vendor/gems/thrift/lib/cocoa/src/TProcessorFactory.h +27 -0
  106. data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.h +27 -0
  107. data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.m +51 -0
  108. data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.h +51 -0
  109. data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.m +477 -0
  110. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocol.h +148 -0
  111. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolException.h +25 -0
  112. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolException.m +23 -0
  113. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolFactory.h +29 -0
  114. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.h +29 -0
  115. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.m +104 -0
  116. data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.h +50 -0
  117. data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.m +153 -0
  118. data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.h +42 -0
  119. data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.m +159 -0
  120. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.h +35 -0
  121. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.m +91 -0
  122. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.h +38 -0
  123. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.m +89 -0
  124. data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.h +32 -0
  125. data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.m +58 -0
  126. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransport.h +36 -0
  127. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.h +30 -0
  128. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.m +43 -0
  129. data/vendor/gems/thrift/lib/cpp/Makefile.am +158 -0
  130. data/vendor/gems/thrift/lib/cpp/README +67 -0
  131. data/vendor/gems/thrift/lib/cpp/src/TLogging.h +163 -0
  132. data/vendor/gems/thrift/lib/cpp/src/TProcessor.h +53 -0
  133. data/vendor/gems/thrift/lib/cpp/src/TReflectionLocal.h +96 -0
  134. data/vendor/gems/thrift/lib/cpp/src/Thrift.cpp +148 -0
  135. data/vendor/gems/thrift/lib/cpp/src/Thrift.h +191 -0
  136. data/vendor/gems/thrift/lib/cpp/src/concurrency/Exception.h +60 -0
  137. data/vendor/gems/thrift/lib/cpp/src/concurrency/FunctionRunner.h +77 -0
  138. data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.cpp +137 -0
  139. data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.h +84 -0
  140. data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.cpp +160 -0
  141. data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.h +114 -0
  142. data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.cpp +314 -0
  143. data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.h +130 -0
  144. data/vendor/gems/thrift/lib/cpp/src/concurrency/Thread.h +125 -0
  145. data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.cpp +493 -0
  146. data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.h +169 -0
  147. data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.cpp +284 -0
  148. data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.h +122 -0
  149. data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.cpp +55 -0
  150. data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.h +100 -0
  151. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/Tests.cpp +155 -0
  152. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadFactoryTests.h +354 -0
  153. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadManagerTests.h +379 -0
  154. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/TimerManagerTests.h +155 -0
  155. data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.cpp +122 -0
  156. data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.h +77 -0
  157. data/vendor/gems/thrift/lib/cpp/src/processor/StatsProcessor.h +264 -0
  158. data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.cpp +79 -0
  159. data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.h +42 -0
  160. data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.cpp +394 -0
  161. data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.h +254 -0
  162. data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.cpp +736 -0
  163. data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.h +279 -0
  164. data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.cpp +346 -0
  165. data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.h +225 -0
  166. data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.cpp +762 -0
  167. data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.h +253 -0
  168. data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.cpp +998 -0
  169. data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.h +340 -0
  170. data/vendor/gems/thrift/lib/cpp/src/protocol/TOneWayProtocol.h +304 -0
  171. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocol.h +438 -0
  172. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolException.h +104 -0
  173. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolTap.h +187 -0
  174. data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.cpp +750 -0
  175. data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.h +435 -0
  176. data/vendor/gems/thrift/lib/cpp/src/server/TServer.cpp +38 -0
  177. data/vendor/gems/thrift/lib/cpp/src/server/TServer.h +213 -0
  178. data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.cpp +118 -0
  179. data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.h +70 -0
  180. data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.cpp +217 -0
  181. data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.h +79 -0
  182. data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.cpp +243 -0
  183. data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.h +74 -0
  184. data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.cpp +370 -0
  185. data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.h +667 -0
  186. data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.cpp +77 -0
  187. data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.h +73 -0
  188. data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.cpp +953 -0
  189. data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.h +442 -0
  190. data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.cpp +348 -0
  191. data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.h +111 -0
  192. data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.cpp +368 -0
  193. data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.h +76 -0
  194. data/vendor/gems/thrift/lib/cpp/src/transport/TServerTransport.h +92 -0
  195. data/vendor/gems/thrift/lib/cpp/src/transport/TShortReadTransport.h +96 -0
  196. data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.cpp +54 -0
  197. data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.h +41 -0
  198. data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.cpp +591 -0
  199. data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.h +242 -0
  200. data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.cpp +235 -0
  201. data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.h +191 -0
  202. data/vendor/gems/thrift/lib/cpp/src/transport/TTransport.h +224 -0
  203. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.cpp +31 -0
  204. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.h +117 -0
  205. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.cpp +178 -0
  206. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.h +287 -0
  207. data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.cpp +299 -0
  208. data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.h +219 -0
  209. data/vendor/gems/thrift/lib/cpp/thrift-nb.pc.in +30 -0
  210. data/vendor/gems/thrift/lib/cpp/thrift-z.pc.in +30 -0
  211. data/vendor/gems/thrift/lib/cpp/thrift.pc.in +29 -0
  212. data/vendor/gems/thrift/lib/csharp/Makefile.am +70 -0
  213. data/vendor/gems/thrift/lib/csharp/README +26 -0
  214. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs +55 -0
  215. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs +242 -0
  216. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj +62 -0
  217. data/vendor/gems/thrift/lib/csharp/src/Collections/THashSet.cs +142 -0
  218. data/vendor/gems/thrift/lib/csharp/src/Protocol/TBase.cs +34 -0
  219. data/vendor/gems/thrift/lib/csharp/src/Protocol/TBinaryProtocol.cs +392 -0
  220. data/vendor/gems/thrift/lib/csharp/src/Protocol/TField.cs +58 -0
  221. data/vendor/gems/thrift/lib/csharp/src/Protocol/TList.cs +50 -0
  222. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMap.cs +58 -0
  223. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessage.cs +58 -0
  224. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessageType.cs +31 -0
  225. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocol.cs +87 -0
  226. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolException.cs +61 -0
  227. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolFactory.cs +29 -0
  228. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolUtil.cs +94 -0
  229. data/vendor/gems/thrift/lib/csharp/src/Protocol/TSet.cs +50 -0
  230. data/vendor/gems/thrift/lib/csharp/src/Protocol/TStruct.cs +42 -0
  231. data/vendor/gems/thrift/lib/csharp/src/Protocol/TType.cs +40 -0
  232. data/vendor/gems/thrift/lib/csharp/src/Server/TServer.cs +135 -0
  233. data/vendor/gems/thrift/lib/csharp/src/Server/TSimpleServer.cs +148 -0
  234. data/vendor/gems/thrift/lib/csharp/src/Server/TThreadPoolServer.cs +186 -0
  235. data/vendor/gems/thrift/lib/csharp/src/Server/TThreadedServer.cs +234 -0
  236. data/vendor/gems/thrift/lib/csharp/src/TApplicationException.cs +131 -0
  237. data/vendor/gems/thrift/lib/csharp/src/TProcessor.cs +29 -0
  238. data/vendor/gems/thrift/lib/csharp/src/Thrift.csproj +73 -0
  239. data/vendor/gems/thrift/lib/csharp/src/Thrift.sln +35 -0
  240. data/vendor/gems/thrift/lib/csharp/src/Transport/TBufferedTransport.cs +100 -0
  241. data/vendor/gems/thrift/lib/csharp/src/Transport/TServerSocket.cs +157 -0
  242. data/vendor/gems/thrift/lib/csharp/src/Transport/TServerTransport.cs +39 -0
  243. data/vendor/gems/thrift/lib/csharp/src/Transport/TSocket.cs +144 -0
  244. data/vendor/gems/thrift/lib/csharp/src/Transport/TStreamTransport.cs +103 -0
  245. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransport.cs +66 -0
  246. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportException.cs +64 -0
  247. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportFactory.cs +38 -0
  248. data/vendor/gems/thrift/lib/erl/Makefile +37 -0
  249. data/vendor/gems/thrift/lib/erl/README +56 -0
  250. data/vendor/gems/thrift/lib/erl/build/beamver +59 -0
  251. data/vendor/gems/thrift/lib/erl/build/buildtargets.mk +15 -0
  252. data/vendor/gems/thrift/lib/erl/build/colors.mk +24 -0
  253. data/vendor/gems/thrift/lib/erl/build/docs.mk +12 -0
  254. data/vendor/gems/thrift/lib/erl/build/mime.types +98 -0
  255. data/vendor/gems/thrift/lib/erl/build/otp.mk +146 -0
  256. data/vendor/gems/thrift/lib/erl/build/otp_subdir.mk +85 -0
  257. data/vendor/gems/thrift/lib/erl/build/raw_test.mk +29 -0
  258. data/vendor/gems/thrift/lib/erl/include/thrift_constants.hrl +54 -0
  259. data/vendor/gems/thrift/lib/erl/include/thrift_protocol.hrl +31 -0
  260. data/vendor/gems/thrift/lib/erl/src/Makefile +116 -0
  261. data/vendor/gems/thrift/lib/erl/src/test_handler.erl +26 -0
  262. data/vendor/gems/thrift/lib/erl/src/test_service.erl +29 -0
  263. data/vendor/gems/thrift/lib/erl/src/thrift.app.src +44 -0
  264. data/vendor/gems/thrift/lib/erl/src/thrift.appup.src +1 -0
  265. data/vendor/gems/thrift/lib/erl/src/thrift_base64_transport.erl +64 -0
  266. data/vendor/gems/thrift/lib/erl/src/thrift_binary_protocol.erl +325 -0
  267. data/vendor/gems/thrift/lib/erl/src/thrift_buffered_transport.erl +180 -0
  268. data/vendor/gems/thrift/lib/erl/src/thrift_client.erl +384 -0
  269. data/vendor/gems/thrift/lib/erl/src/thrift_disk_log_transport.erl +118 -0
  270. data/vendor/gems/thrift/lib/erl/src/thrift_file_transport.erl +87 -0
  271. data/vendor/gems/thrift/lib/erl/src/thrift_framed_transport.erl +208 -0
  272. data/vendor/gems/thrift/lib/erl/src/thrift_http_transport.erl +199 -0
  273. data/vendor/gems/thrift/lib/erl/src/thrift_memory_buffer.erl +164 -0
  274. data/vendor/gems/thrift/lib/erl/src/thrift_processor.erl +188 -0
  275. data/vendor/gems/thrift/lib/erl/src/thrift_protocol.erl +356 -0
  276. data/vendor/gems/thrift/lib/erl/src/thrift_server.erl +183 -0
  277. data/vendor/gems/thrift/lib/erl/src/thrift_service.erl +25 -0
  278. data/vendor/gems/thrift/lib/erl/src/thrift_socket_server.erl +249 -0
  279. data/vendor/gems/thrift/lib/erl/src/thrift_socket_transport.erl +119 -0
  280. data/vendor/gems/thrift/lib/erl/src/thrift_transport.erl +57 -0
  281. data/vendor/gems/thrift/lib/erl/vsn.mk +1 -0
  282. data/vendor/gems/thrift/lib/hs/README +82 -0
  283. data/vendor/gems/thrift/lib/hs/Setup.lhs +23 -0
  284. data/vendor/gems/thrift/lib/hs/TODO +2 -0
  285. data/vendor/gems/thrift/lib/hs/Thrift.cabal +20 -0
  286. data/vendor/gems/thrift/lib/hs/src/Thrift.hs +111 -0
  287. data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol.hs +191 -0
  288. data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol/Binary.hs +147 -0
  289. data/vendor/gems/thrift/lib/hs/src/Thrift/Server.hs +65 -0
  290. data/vendor/gems/thrift/lib/hs/src/Thrift/Transport.hs +60 -0
  291. data/vendor/gems/thrift/lib/hs/src/Thrift/Transport/Handle.hs +58 -0
  292. data/vendor/gems/thrift/lib/java/Makefile.am +38 -0
  293. data/vendor/gems/thrift/lib/java/README +43 -0
  294. data/vendor/gems/thrift/lib/java/build.xml +195 -0
  295. data/vendor/gems/thrift/lib/java/ivy.xml +8 -0
  296. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/IntRangeSet.java +171 -0
  297. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TApplicationException.java +123 -0
  298. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBase.java +66 -0
  299. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBaseHelper.java +102 -0
  300. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TByteArrayOutputStream.java +46 -0
  301. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TDeserializer.java +94 -0
  302. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TException.java +45 -0
  303. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TFieldRequirementType.java +30 -0
  304. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessor.java +32 -0
  305. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessorFactory.java +39 -0
  306. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TSerializer.java +110 -0
  307. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldMetaData.java +69 -0
  308. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java +42 -0
  309. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/ListMetaData.java +29 -0
  310. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/MapMetaData.java +31 -0
  311. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/SetMetaData.java +29 -0
  312. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/StructMetaData.java +31 -0
  313. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBase64Utils.java +128 -0
  314. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java +331 -0
  315. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java +741 -0
  316. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TField.java +48 -0
  317. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java +927 -0
  318. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TList.java +38 -0
  319. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMap.java +40 -0
  320. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessage.java +48 -0
  321. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessageType.java +31 -0
  322. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocol.java +146 -0
  323. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolException.java +81 -0
  324. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolFactory.java +30 -0
  325. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolUtil.java +158 -0
  326. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSet.java +42 -0
  327. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java +384 -0
  328. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TStruct.java +36 -0
  329. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TType.java +40 -0
  330. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/THsHaServer.java +304 -0
  331. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TNonblockingServer.java +772 -0
  332. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TServer.java +126 -0
  333. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TSimpleServer.java +145 -0
  334. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java +271 -0
  335. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TFramedTransport.java +126 -0
  336. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/THttpClient.java +157 -0
  337. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TIOStreamTransport.java +159 -0
  338. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TMemoryBuffer.java +98 -0
  339. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerSocket.java +160 -0
  340. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerTransport.java +31 -0
  341. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingSocket.java +213 -0
  342. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingTransport.java +31 -0
  343. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TServerSocket.java +145 -0
  344. metadata +348 -37
  345. data/vendor/gems/trollop/FAQ.txt +0 -35
  346. data/vendor/gems/trollop/History.txt +0 -84
  347. data/vendor/gems/trollop/Manifest.txt +0 -7
  348. data/vendor/gems/trollop/README.txt +0 -38
  349. data/vendor/gems/trollop/Rakefile +0 -36
  350. data/vendor/gems/trollop/lib/trollop.rb +0 -695
  351. data/vendor/gems/trollop/release-script.txt +0 -13
  352. data/vendor/gems/trollop/test/test_trollop.rb +0 -957
  353. data/vendor/gems/trollop/www/index.html +0 -167
@@ -0,0 +1,1445 @@
1
+ /*
2
+ * Licensed to the Apache Software Foundation (ASF) under one
3
+ * or more contributor license agreements. See the NOTICE file
4
+ * distributed with this work for additional information
5
+ * regarding copyright ownership. The ASF licenses this file
6
+ * to you under the Apache License, Version 2.0 (the
7
+ * "License"); you may not use this file except in compliance
8
+ * with the License. You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing,
13
+ * software distributed under the License is distributed on an
14
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ * KIND, either express or implied. See the License for the
16
+ * specific language governing permissions and limitations
17
+ * under the License.
18
+ */
19
+
20
+ #include <string>
21
+ #include <fstream>
22
+ #include <iostream>
23
+ #include <vector>
24
+
25
+ #include <stdlib.h>
26
+ #include <sys/stat.h>
27
+ #include <sys/types.h>
28
+ #include <sstream>
29
+ #include "t_oop_generator.h"
30
+ #include "platform.h"
31
+ using namespace std;
32
+
33
+
34
+ /**
35
+ * Haskell code generator.
36
+ *
37
+ */
38
+ class t_hs_generator : public t_oop_generator {
39
+ public:
40
+ t_hs_generator(
41
+ t_program* program,
42
+ const std::map<std::string, std::string>& parsed_options,
43
+ const std::string& option_string)
44
+ : t_oop_generator(program)
45
+ {
46
+ out_dir_base_ = "gen-hs";
47
+ }
48
+
49
+ /**
50
+ * Init and close methods
51
+ */
52
+
53
+ void init_generator();
54
+ void close_generator();
55
+
56
+ /**
57
+ * Program-level generation functions
58
+ */
59
+ void generate_typedef (t_typedef* ttypedef);
60
+ void generate_enum (t_enum* tenum);
61
+ void generate_const (t_const* tconst);
62
+ void generate_struct (t_struct* tstruct);
63
+ void generate_xception (t_struct* txception);
64
+ void generate_service (t_service* tservice);
65
+
66
+ std::string render_const_value(t_type* type, t_const_value* value);
67
+
68
+ /**
69
+ * Struct generation code
70
+ */
71
+
72
+ void generate_hs_struct(t_struct* tstruct, bool is_exception);
73
+ void generate_hs_struct_definition(std::ofstream &out,t_struct* tstruct, bool is_xception=false,bool helper=false);
74
+ void generate_hs_struct_reader(std::ofstream& out, t_struct* tstruct);
75
+ void generate_hs_struct_writer(std::ofstream& out, t_struct* tstruct);
76
+ void generate_hs_function_helpers(t_function* tfunction);
77
+
78
+ /**
79
+ * Service-level generation functions
80
+ */
81
+
82
+ void generate_service_helpers (t_service* tservice);
83
+ void generate_service_interface (t_service* tservice);
84
+ void generate_service_client (t_service* tservice);
85
+ void generate_service_server (t_service* tservice);
86
+ void generate_process_function (t_service* tservice, t_function* tfunction);
87
+
88
+ /**
89
+ * Serialization constructs
90
+ */
91
+
92
+ void generate_deserialize_field (std::ofstream &out,
93
+ t_field* tfield,
94
+ std::string prefix);
95
+
96
+ void generate_deserialize_struct (std::ofstream &out,
97
+ t_struct* tstruct);
98
+
99
+ void generate_deserialize_container (std::ofstream &out,
100
+ t_type* ttype);
101
+
102
+ void generate_deserialize_set_element (std::ofstream &out,
103
+ t_set* tset);
104
+
105
+
106
+ void generate_deserialize_list_element (std::ofstream &out,
107
+ t_list* tlist,
108
+ std::string prefix="");
109
+ void generate_deserialize_type (std::ofstream &out,
110
+ t_type* type);
111
+
112
+ void generate_serialize_field (std::ofstream &out,
113
+ t_field* tfield,
114
+ std::string name= "");
115
+
116
+ void generate_serialize_struct (std::ofstream &out,
117
+ t_struct* tstruct,
118
+ std::string prefix="");
119
+
120
+ void generate_serialize_container (std::ofstream &out,
121
+ t_type* ttype,
122
+ std::string prefix="");
123
+
124
+ void generate_serialize_map_element (std::ofstream &out,
125
+ t_map* tmap,
126
+ std::string kiter,
127
+ std::string viter);
128
+
129
+ void generate_serialize_set_element (std::ofstream &out,
130
+ t_set* tmap,
131
+ std::string iter);
132
+
133
+ void generate_serialize_list_element (std::ofstream &out,
134
+ t_list* tlist,
135
+ std::string iter);
136
+
137
+ /**
138
+ * Helper rendering functions
139
+ */
140
+
141
+ std::string hs_autogen_comment();
142
+ std::string hs_imports();
143
+ std::string type_name(t_type* ttype);
144
+ std::string function_type(t_function* tfunc, bool options = false, bool io = false, bool method = false);
145
+ std::string type_to_enum(t_type* ttype);
146
+ std::string render_hs_type(t_type* type, bool needs_parens = true);
147
+
148
+
149
+ private:
150
+
151
+ /**
152
+ * File streams
153
+ */
154
+
155
+ std::ofstream f_types_;
156
+ std::ofstream f_consts_;
157
+ std::ofstream f_service_;
158
+ std::ofstream f_iface_;
159
+ std::ofstream f_client_;
160
+
161
+ };
162
+
163
+
164
+ /**
165
+ * Prepares for file generation by opening up the necessary file output
166
+ * streams.
167
+ *
168
+ * @param tprogram The program to generate
169
+ */
170
+ void t_hs_generator::init_generator() {
171
+ // Make output directory
172
+ MKDIR(get_out_dir().c_str());
173
+
174
+ // Make output file
175
+
176
+ string pname = capitalize(program_name_);
177
+ string f_types_name = get_out_dir()+pname+"_Types.hs";
178
+ f_types_.open(f_types_name.c_str());
179
+
180
+ string f_consts_name = get_out_dir()+pname+"_Consts.hs";
181
+ f_consts_.open(f_consts_name.c_str());
182
+
183
+ // Print header
184
+ f_types_ <<
185
+ hs_autogen_comment() << endl <<
186
+ "module " << pname <<"_Types where" << endl <<
187
+ hs_imports() << endl;
188
+
189
+ f_consts_ <<
190
+ hs_autogen_comment() << endl <<
191
+ "module " << pname <<"_Consts where" << endl <<
192
+ hs_imports() << endl <<
193
+ "import " << pname<<"_Types"<< endl;
194
+
195
+ }
196
+
197
+
198
+ /**
199
+ * Autogen'd comment
200
+ */
201
+ string t_hs_generator::hs_autogen_comment() {
202
+ return
203
+ std::string("-----------------------------------------------------------------\n") +
204
+ "-- Autogenerated by Thrift --\n" +
205
+ "-- --\n" +
206
+ "-- DO NOT EDIT UNLESS YOU ARE SURE YOU KNOW WHAT YOU ARE DOING --\n" +
207
+ "-----------------------------------------------------------------\n";
208
+ }
209
+
210
+ /**
211
+ * Prints standard thrift imports
212
+ */
213
+ string t_hs_generator::hs_imports() {
214
+ return "import Thrift\nimport Data.Typeable ( Typeable )\nimport Control.Exception\nimport qualified Data.Map as Map\nimport qualified Data.Set as Set\nimport Data.Int";
215
+ }
216
+
217
+ /**
218
+ * Closes the type files
219
+ */
220
+ void t_hs_generator::close_generator() {
221
+ // Close types file
222
+ f_types_.close();
223
+ f_consts_.close();
224
+ }
225
+
226
+ /**
227
+ * Generates a typedef. Ez.
228
+ *
229
+ * @param ttypedef The type definition
230
+ */
231
+ void t_hs_generator::generate_typedef(t_typedef* ttypedef) {
232
+ f_types_ <<
233
+ indent() << "type "<< capitalize(ttypedef->get_symbolic()) << " = " << render_hs_type(ttypedef->get_type(), false) << endl << endl;
234
+ }
235
+
236
+ /**
237
+ * Generates code for an enumerated type.
238
+ * the values.
239
+ *
240
+ * @param tenum The enumeration
241
+ */
242
+ void t_hs_generator::generate_enum(t_enum* tenum) {
243
+ indent(f_types_) << "data "<<capitalize(tenum->get_name())<<" = ";
244
+ indent_up();
245
+ vector<t_enum_value*> constants = tenum->get_constants();
246
+ vector<t_enum_value*>::iterator c_iter;
247
+ bool first = true;
248
+ for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
249
+ string name = capitalize((*c_iter)->get_name());
250
+ if(first)
251
+ first=false;
252
+ else
253
+ f_types_ << "|";
254
+ f_types_ << name;
255
+ }
256
+ indent(f_types_) << "deriving (Show,Eq, Typeable, Ord)" << endl;
257
+ indent_down();
258
+
259
+ int value = -1;
260
+ indent(f_types_) << "instance Enum " << capitalize(tenum->get_name()) << " where" << endl;
261
+ indent_up();
262
+ indent(f_types_) << "fromEnum t = case t of" << endl;
263
+ indent_up();
264
+ for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
265
+ if ((*c_iter)->has_value()) {
266
+ value = (*c_iter)->get_value();
267
+ } else {
268
+ ++value;
269
+ }
270
+ string name = capitalize((*c_iter)->get_name());
271
+
272
+ f_types_ <<
273
+ indent() << name << " -> " << value << endl;
274
+ }
275
+ indent_down();
276
+
277
+ indent(f_types_) << "toEnum t = case t of" << endl;
278
+ indent_up();
279
+ for(c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
280
+ if ((*c_iter)->has_value()) {
281
+ value = (*c_iter)->get_value();
282
+ } else {
283
+ ++value;
284
+ }
285
+ string name = capitalize((*c_iter)->get_name());
286
+
287
+ f_types_ <<
288
+ indent() << value << " -> " << name << endl;
289
+ }
290
+ indent(f_types_) << "_ -> throw ThriftException" << endl;
291
+ indent_down();
292
+ indent_down();
293
+ }
294
+
295
+ /**
296
+ * Generate a constant value
297
+ */
298
+ void t_hs_generator::generate_const(t_const* tconst) {
299
+ t_type* type = tconst->get_type();
300
+ string name = decapitalize(tconst->get_name());
301
+ t_const_value* value = tconst->get_value();
302
+
303
+ indent(f_consts_) << name << " :: " << render_hs_type(type, false) << endl;
304
+ indent(f_consts_) << name << " = " << render_const_value(type, value) << endl << endl;
305
+ }
306
+
307
+ /**
308
+ * Prints the value of a constant with the given type. Note that type checking
309
+ * is NOT performed in this function as it is always run beforehand using the
310
+ * validate_types method in main.cc
311
+ */
312
+ string t_hs_generator::render_const_value(t_type* type, t_const_value* value) {
313
+ type = get_true_type(type);
314
+ std::ostringstream out;
315
+ if (type->is_base_type()) {
316
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
317
+ switch (tbase) {
318
+ case t_base_type::TYPE_STRING:
319
+ out << '"' << get_escaped_string(value) << '"';
320
+ break;
321
+ case t_base_type::TYPE_BOOL:
322
+ out << (value->get_integer() > 0 ? "True" : "False");
323
+ break;
324
+ case t_base_type::TYPE_BYTE:
325
+ case t_base_type::TYPE_I16:
326
+ case t_base_type::TYPE_I32:
327
+ case t_base_type::TYPE_I64:
328
+ out << value->get_integer();
329
+ break;
330
+ case t_base_type::TYPE_DOUBLE:
331
+ if (value->get_type() == t_const_value::CV_INTEGER) {
332
+ out << value->get_integer();
333
+ } else {
334
+ out << value->get_double();
335
+ }
336
+ break;
337
+ default:
338
+ throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase);
339
+ }
340
+ } else if (type->is_enum()) {
341
+ t_enum* tenum = (t_enum*)type;
342
+ vector<t_enum_value*> constants = tenum->get_constants();
343
+ vector<t_enum_value*>::iterator c_iter;
344
+ int val = -1;
345
+ for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
346
+ if ((*c_iter)->has_value()) {
347
+ val = (*c_iter)->get_value();
348
+ } else {
349
+ ++val;
350
+ }
351
+ if(val == value->get_integer()){
352
+ indent(out) << capitalize((*c_iter)->get_name());
353
+ break;
354
+ }
355
+ }
356
+ } else if (type->is_struct() || type->is_xception()) {
357
+ string cname = type_name(type);
358
+ indent(out) << cname << "{";
359
+ const vector<t_field*>& fields = ((t_struct*)type)->get_members();
360
+ vector<t_field*>::const_iterator f_iter;
361
+ const map<t_const_value*, t_const_value*>& val = value->get_map();
362
+ map<t_const_value*, t_const_value*>::const_iterator v_iter;
363
+ bool first = true;
364
+ for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
365
+ t_type* field_type = NULL;
366
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
367
+ if ((*f_iter)->get_name() == v_iter->first->get_string()) {
368
+ field_type = (*f_iter)->get_type();
369
+ }
370
+ }
371
+ if (field_type == NULL) {
372
+ throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
373
+ }
374
+ string fname = v_iter->first->get_string();
375
+ if(first)
376
+ first=false;
377
+ else
378
+ out << ",";
379
+ out << "f_" << cname << "_" << fname << " = Just (" << render_const_value(field_type, v_iter->second) << ")";
380
+
381
+ }
382
+ indent(out) << "}";
383
+ } else if (type->is_map()) {
384
+ t_type* ktype = ((t_map*)type)->get_key_type();
385
+ t_type* vtype = ((t_map*)type)->get_val_type();
386
+ const map<t_const_value*, t_const_value*>& val = value->get_map();
387
+ map<t_const_value*, t_const_value*>::const_iterator v_iter;
388
+ out << "(Map.fromList [";
389
+ bool first=true;
390
+ for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
391
+ string key = render_const_value(ktype, v_iter->first);
392
+ string val = render_const_value(vtype, v_iter->second);
393
+ if(first)
394
+ first=false;
395
+ else
396
+ out << ",";
397
+ out << "(" << key << ","<< val << ")";
398
+ }
399
+ out << "])";
400
+ } else if (type->is_list() || type->is_set()) {
401
+ t_type* etype;
402
+
403
+ if (type->is_list()) {
404
+ etype = ((t_list*) type)->get_elem_type();
405
+ } else {
406
+ etype = ((t_set*) type)->get_elem_type();
407
+ }
408
+
409
+ const vector<t_const_value*>& val = value->get_list();
410
+ vector<t_const_value*>::const_iterator v_iter;
411
+ bool first = true;
412
+
413
+ if (type->is_set())
414
+ out << "(Set.fromList ";
415
+
416
+ out << "[";
417
+
418
+ for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
419
+ if(first)
420
+ first=false;
421
+ else
422
+ out << ",";
423
+ out << render_const_value(etype, *v_iter);
424
+ }
425
+
426
+ out << "]";
427
+ if (type->is_set())
428
+ out << ")";
429
+ } else {
430
+ throw "CANNOT GENERATE CONSTANT FOR TYPE: " + type->get_name();
431
+ }
432
+ return out.str();
433
+ }
434
+
435
+ /**
436
+ * Generates a "struct"
437
+ */
438
+ void t_hs_generator::generate_struct(t_struct* tstruct) {
439
+ generate_hs_struct(tstruct, false);
440
+ }
441
+
442
+ /**
443
+ * Generates a struct definition for a thrift exception. Basically the same
444
+ * as a struct, but also has an exception declaration.
445
+ *
446
+ * @param txception The struct definition
447
+ */
448
+ void t_hs_generator::generate_xception(t_struct* txception) {
449
+ generate_hs_struct(txception, true);
450
+ }
451
+
452
+ /**
453
+ * Generates a Haskell struct
454
+ */
455
+ void t_hs_generator::generate_hs_struct(t_struct* tstruct,
456
+ bool is_exception) {
457
+ generate_hs_struct_definition(f_types_,tstruct, is_exception,false);
458
+ }
459
+
460
+ /**
461
+ * Generates a struct definition for a thrift data type.
462
+ *
463
+ * @param tstruct The struct definition
464
+ */
465
+ void t_hs_generator::generate_hs_struct_definition(ofstream& out,
466
+ t_struct* tstruct,
467
+ bool is_exception,
468
+ bool helper) {
469
+ string tname = type_name(tstruct);
470
+ string name = tstruct->get_name();
471
+ const vector<t_field*>& members = tstruct->get_members();
472
+ vector<t_field*>::const_iterator m_iter;
473
+
474
+ indent(out) << "data "<<tname<<" = "<<tname;
475
+ if (members.size() > 0) {
476
+ out << "{";
477
+ bool first=true;
478
+ for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
479
+ if(first)
480
+ first=false;
481
+ else
482
+ out << ",";
483
+ string mname = (*m_iter)->get_name();
484
+ out << "f_" << tname << "_" << mname << " :: Maybe " << render_hs_type((*m_iter)->get_type());
485
+ }
486
+ out << "}";
487
+ }
488
+
489
+ out << " deriving (Show,Eq,Ord,Typeable)" << endl;
490
+ if (is_exception) out << "instance Exception " << tname << endl;
491
+ generate_hs_struct_writer(out, tstruct);
492
+
493
+ generate_hs_struct_reader(out, tstruct);
494
+ //f_struct_.close();
495
+ }
496
+
497
+
498
+
499
+ /**
500
+ * Generates the read method for a struct
501
+ */
502
+ void t_hs_generator::generate_hs_struct_reader(ofstream& out, t_struct* tstruct) {
503
+ const vector<t_field*>& fields = tstruct->get_members();
504
+ vector<t_field*>::const_iterator f_iter;
505
+ string sname = type_name(tstruct);
506
+ string str = tmp("_str");
507
+ string t = tmp("_t");
508
+ string id = tmp("_id");
509
+
510
+ indent(out) << "read_" << sname << "_fields iprot rec = do" << endl;
511
+ indent_up(); // do
512
+
513
+ // Read beginning field marker
514
+ indent(out) << "(_," << t <<","<<id<<") <- readFieldBegin iprot" << endl;
515
+ // Check for field STOP marker and break
516
+ indent(out) <<
517
+ "if " << t <<" == T_STOP then return rec else" << endl;
518
+ indent_up(); // if
519
+ indent(out) << "case " << id<<" of " << endl;
520
+ indent_up(); // case
521
+ // Generate deserialization code for known cases
522
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
523
+ indent(out) << (*f_iter)->get_key() << " -> ";
524
+ out << "if " << t <<" == " << type_to_enum((*f_iter)->get_type()) << " then do" << endl;
525
+ indent_up(); // if
526
+ indent(out) << "s <- ";
527
+ generate_deserialize_field(out, *f_iter,str);
528
+ out << endl;
529
+ indent(out) << "read_"<<sname<<"_fields iprot rec{f_"<<sname<<"_"<< decapitalize((*f_iter)->get_name()) <<"=Just s}" << endl;
530
+ out <<
531
+ indent() << "else do" << endl;
532
+ indent_up();
533
+ indent(out) << "skip iprot "<< t << endl;
534
+ indent(out) << "read_"<<sname<<"_fields iprot rec" << endl;
535
+ indent_down(); // -do
536
+ indent_down(); // -if
537
+ }
538
+
539
+
540
+ // In the default case we skip the field
541
+ out <<
542
+ indent() << "_ -> do" << endl;
543
+ indent_up();
544
+ indent(out) << "skip iprot "<<t<< endl;
545
+ indent(out) << "readFieldEnd iprot" << endl;
546
+ indent(out) << "read_"<<sname<<"_fields iprot rec" << endl;
547
+ indent_down(); // -case
548
+ indent_down(); // -if
549
+ indent_down(); // -do
550
+ indent_down();
551
+
552
+ // read
553
+ indent(out) << "read_"<<sname<<" iprot = do" << endl;
554
+ indent_up();
555
+ indent(out) << "readStructBegin iprot" << endl;
556
+ indent(out) << "rec <- read_"<<sname<<"_fields iprot ("<<sname<<"{";
557
+ bool first = true;
558
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
559
+ if(first)
560
+ first=false;
561
+ else
562
+ out << ",";
563
+ out << "f_" << sname << "_" << decapitalize((*f_iter)->get_name()) << "=Nothing";
564
+ }
565
+ out << "})" << endl;
566
+ indent(out) << "readStructEnd iprot" << endl;
567
+ indent(out) << "return rec" << endl;
568
+ indent_down();
569
+ }
570
+
571
+ void t_hs_generator::generate_hs_struct_writer(ofstream& out,
572
+ t_struct* tstruct) {
573
+ string name = type_name(tstruct);
574
+ const vector<t_field*>& fields = tstruct->get_sorted_members();
575
+ vector<t_field*>::const_iterator f_iter;
576
+ string str = tmp("_str");
577
+ string f = tmp("_f");
578
+
579
+ indent(out) <<
580
+ "write_"<<name<<" oprot rec = do" << endl;
581
+ indent_up();
582
+ indent(out) <<
583
+ "writeStructBegin oprot \""<<name<<"\"" << endl;
584
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
585
+ // Write field header
586
+ string mname = (*f_iter)->get_name();
587
+ indent(out) <<
588
+ "case f_" << name << "_" << mname << " rec of {Nothing -> return (); Just _v -> do" << endl;
589
+ indent_up();
590
+ indent(out) << "writeFieldBegin oprot (\""<< (*f_iter)->get_name()<<"\","
591
+ <<type_to_enum((*f_iter)->get_type())<<","
592
+ <<(*f_iter)->get_key()<<")" << endl;
593
+
594
+ // Write field contents
595
+ out << indent();
596
+ generate_serialize_field(out, *f_iter, "_v");
597
+ out << endl;
598
+ // Write field closer
599
+ indent(out) << "writeFieldEnd oprot}" << endl;
600
+ indent_down();
601
+ }
602
+
603
+ // Write the struct map
604
+ out <<
605
+ indent() << "writeFieldStop oprot" << endl <<
606
+ indent() << "writeStructEnd oprot" << endl;
607
+
608
+ indent_down();
609
+ }
610
+
611
+ /**
612
+ * Generates a thrift service.
613
+ *
614
+ * @param tservice The service definition
615
+ */
616
+ void t_hs_generator::generate_service(t_service* tservice) {
617
+ string f_service_name = get_out_dir()+capitalize(service_name_)+".hs";
618
+ f_service_.open(f_service_name.c_str());
619
+
620
+ f_service_ <<
621
+ hs_autogen_comment() << endl <<
622
+ "module " << capitalize(service_name_) << " where" << endl <<
623
+ hs_imports() << endl;
624
+
625
+
626
+ if(tservice->get_extends()){
627
+ f_service_ <<
628
+ "import qualified " << capitalize(tservice->get_extends()->get_name()) << endl;
629
+ }
630
+
631
+
632
+ f_service_ <<
633
+ "import " << capitalize(program_name_) << "_Types" << endl <<
634
+ "import qualified " << capitalize(service_name_) << "_Iface as Iface" << endl;
635
+
636
+
637
+ // Generate the three main parts of the service
638
+ generate_service_helpers(tservice);
639
+ generate_service_interface(tservice);
640
+ generate_service_client(tservice);
641
+ generate_service_server(tservice);
642
+
643
+
644
+ // Close service file
645
+ f_service_.close();
646
+ }
647
+
648
+ /**
649
+ * Generates helper functions for a service.
650
+ *
651
+ * @param tservice The service to generate a header definition for
652
+ */
653
+ void t_hs_generator::generate_service_helpers(t_service* tservice) {
654
+ vector<t_function*> functions = tservice->get_functions();
655
+ vector<t_function*>::iterator f_iter;
656
+
657
+ indent(f_service_) <<
658
+ "-- HELPER FUNCTIONS AND STRUCTURES --" << endl << endl;
659
+
660
+ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
661
+ t_struct* ts = (*f_iter)->get_arglist();
662
+ generate_hs_struct_definition(f_service_,ts, false);
663
+ generate_hs_function_helpers(*f_iter);
664
+ }
665
+ }
666
+
667
+ /**
668
+ * Generates a struct and helpers for a function.
669
+ *
670
+ * @param tfunction The function
671
+ */
672
+ void t_hs_generator::generate_hs_function_helpers(t_function* tfunction) {
673
+ t_struct result(program_, decapitalize(tfunction->get_name()) + "_result");
674
+ t_field success(tfunction->get_returntype(), "success", 0);
675
+ if (!tfunction->get_returntype()->is_void()) {
676
+ result.append(&success);
677
+ }
678
+
679
+ t_struct* xs = tfunction->get_xceptions();
680
+ const vector<t_field*>& fields = xs->get_members();
681
+ vector<t_field*>::const_iterator f_iter;
682
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
683
+ result.append(*f_iter);
684
+ }
685
+ generate_hs_struct_definition(f_service_,&result, false);
686
+ }
687
+
688
+ /**
689
+ * Generates a service interface definition.
690
+ *
691
+ * @param tservice The service to generate a header definition for
692
+ */
693
+ void t_hs_generator::generate_service_interface(t_service* tservice) {
694
+ string f_iface_name = get_out_dir()+capitalize(service_name_)+"_Iface.hs";
695
+ f_iface_.open(f_iface_name.c_str());
696
+ indent(f_iface_) << "module " << capitalize(service_name_) << "_Iface where" << endl;
697
+
698
+ indent(f_iface_) <<
699
+ hs_imports() << endl <<
700
+ "import " << capitalize(program_name_) << "_Types" << endl <<
701
+ endl;
702
+
703
+ if (tservice->get_extends() != NULL) {
704
+ string extends = type_name(tservice->get_extends());
705
+ indent(f_iface_) << "import " << extends <<"_Iface" << endl;
706
+ indent(f_iface_) << "class "<< extends << "_Iface a => " << capitalize(service_name_) << "_Iface a where" << endl;
707
+ } else {
708
+ f_iface_ << indent() << "class " << capitalize(service_name_) << "_Iface a where" << endl;
709
+ }
710
+ indent_up();
711
+
712
+ vector<t_function*> functions = tservice->get_functions();
713
+ vector<t_function*>::iterator f_iter;
714
+ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
715
+ string ft = function_type(*f_iter,true,true,true);
716
+ f_iface_ <<
717
+ indent() << decapitalize((*f_iter)->get_name()) << " :: a -> " << ft << endl;
718
+ }
719
+ indent_down();
720
+ f_iface_.close();
721
+
722
+ }
723
+
724
+ /**
725
+ * Generates a service client definition. Note that in Haskell, the client doesn't implement iface. This is because
726
+ * The client does not (and should not have to) deal with arguments being Nothing.
727
+ *
728
+ * @param tservice The service to generate a server for.
729
+ */
730
+ void t_hs_generator::generate_service_client(t_service* tservice) {
731
+ string f_client_name = get_out_dir()+capitalize(service_name_)+"_Client.hs";
732
+ f_client_.open(f_client_name.c_str());
733
+
734
+ vector<t_function*> functions = tservice->get_functions();
735
+ vector<t_function*>::const_iterator f_iter;
736
+
737
+ string extends = "";
738
+ string exports="";
739
+ bool first = true;
740
+ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
741
+ if(first)
742
+ first=false;
743
+ else
744
+ exports+=",";
745
+ string funname = (*f_iter)->get_name();
746
+ exports+=funname;
747
+ }
748
+ indent(f_client_) << "module " << capitalize(service_name_) << "_Client("<<exports<<") where" << endl;
749
+
750
+ if (tservice->get_extends() != NULL) {
751
+ extends = type_name(tservice->get_extends());
752
+ indent(f_client_) << "import " << extends << "_Client" << endl;
753
+ }
754
+ indent(f_client_) << "import Data.IORef" << endl;
755
+ indent(f_client_) << hs_imports() << endl;
756
+ indent(f_client_) << "import " << capitalize(program_name_) << "_Types" << endl;
757
+ indent(f_client_) << "import " << capitalize(service_name_) << endl;
758
+ // DATS RITE A GLOBAL VAR
759
+ indent(f_client_) << "seqid = newIORef 0" << endl;
760
+
761
+
762
+ // Generate client method implementations
763
+
764
+ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
765
+ t_struct* arg_struct = (*f_iter)->get_arglist();
766
+ const vector<t_field*>& fields = arg_struct->get_members();
767
+ vector<t_field*>::const_iterator fld_iter;
768
+ string funname = (*f_iter)->get_name();
769
+
770
+ string fargs = "";
771
+ for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
772
+ fargs+= " arg_" + decapitalize((*fld_iter)->get_name());
773
+ }
774
+
775
+ // Open function
776
+ indent(f_client_) << funname << " (ip,op)" << fargs << " = do" << endl;
777
+ indent_up();
778
+ indent(f_client_) << "send_" << funname << " op" << fargs;
779
+
780
+ f_client_ << endl;
781
+
782
+ if (!(*f_iter)->is_oneway()) {
783
+ f_client_ << indent();
784
+ f_client_ <<
785
+ "recv_" << funname << " ip" << endl;
786
+ }
787
+ indent_down();
788
+
789
+ indent(f_client_) <<
790
+ "send_" << funname << " op" << fargs << " = do" << endl;
791
+ indent_up();
792
+ indent(f_client_) << "seq <- seqid" << endl;
793
+ indent(f_client_) << "seqn <- readIORef seq" << endl;
794
+ std::string argsname = capitalize((*f_iter)->get_name() + "_args");
795
+
796
+ // Serialize the request header
797
+ f_client_ <<
798
+ indent() << "writeMessageBegin op (\"" << (*f_iter)->get_name() << "\", M_CALL, seqn)" << endl;
799
+ f_client_ << indent() << "write_" << argsname << " op ("<<argsname<<"{";
800
+ bool first = true;
801
+ for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
802
+ if(first)
803
+ first=false;
804
+ else
805
+ f_client_ << ",";
806
+ f_client_ << "f_" << argsname <<"_" << (*fld_iter)->get_name() << "=Just arg_" << (*fld_iter)->get_name();
807
+ }
808
+ f_client_ << "})" << endl;
809
+
810
+ // Write to the stream
811
+ f_client_ <<
812
+ indent() << "writeMessageEnd op" << endl <<
813
+ indent() << "tFlush (getTransport op)" << endl;
814
+
815
+ indent_down();
816
+
817
+ if (!(*f_iter)->is_oneway()) {
818
+ std::string resultname = capitalize((*f_iter)->get_name() + "_result");
819
+ t_struct noargs(program_);
820
+
821
+ std::string funname = string("recv_") + (*f_iter)->get_name();
822
+
823
+ t_function recv_function((*f_iter)->get_returntype(),
824
+ funname,
825
+ &noargs);
826
+ // Open function
827
+ f_client_ <<
828
+ indent() << funname << " ip = do" << endl;
829
+ indent_up(); // fun
830
+
831
+ // TODO(mcslee): Validate message reply here, seq ids etc.
832
+
833
+ f_client_ <<
834
+ indent() << "(fname, mtype, rseqid) <- readMessageBegin ip" << endl;
835
+ f_client_ <<
836
+ indent() << "if mtype == M_EXCEPTION then do" << endl <<
837
+ indent() << " x <- readAppExn ip" << endl <<
838
+ indent() << " readMessageEnd ip" << endl;
839
+ f_client_ <<
840
+ indent() << " throw x" << endl;
841
+ f_client_ <<
842
+ indent() << " else return ()" << endl;
843
+
844
+ t_struct* xs = (*f_iter)->get_xceptions();
845
+ const std::vector<t_field*>& xceptions = xs->get_members();
846
+
847
+ f_client_ <<
848
+ indent() << "res <- read_" << resultname << " ip" << endl;
849
+ f_client_ <<
850
+ indent() << "readMessageEnd ip" << endl;
851
+
852
+ // Careful, only return _result if not a void function
853
+ if (!(*f_iter)->get_returntype()->is_void()) {
854
+ f_client_ <<
855
+ indent() << "case f_" << resultname << "_success res of" << endl;
856
+ indent_up(); // case
857
+ indent(f_client_) << "Just v -> return v" << endl;
858
+ indent(f_client_) << "Nothing -> do" << endl;
859
+ indent_up(); // none
860
+ }
861
+
862
+
863
+ vector<t_field*>::const_iterator x_iter;
864
+ for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
865
+ f_client_ <<
866
+ indent() << "case f_"<< resultname << "_" << (*x_iter)->get_name() << " res of" << endl;
867
+ indent_up(); //case
868
+ indent(f_client_) << "Nothing -> return ()" << endl;
869
+ indent(f_client_) << "Just _v -> throw _v" << endl;
870
+ indent_down(); //-case
871
+ }
872
+
873
+ // Careful, only return _result if not a void function
874
+ if ((*f_iter)->get_returntype()->is_void()) {
875
+ indent(f_client_) <<
876
+ "return ()" << endl;
877
+ } else {
878
+ f_client_ <<
879
+ indent() << "throw (AppExn AE_MISSING_RESULT \"" << (*f_iter)->get_name() << " failed: unknown result\")" << endl;
880
+ indent_down(); //-none
881
+ indent_down(); //-case
882
+ }
883
+
884
+ // Close function
885
+ indent_down(); //-fun
886
+ }
887
+ }
888
+ f_client_.close();
889
+
890
+
891
+ }
892
+
893
+ /**
894
+ * Generates a service server definition.
895
+ *
896
+ * @param tservice The service to generate a server for.
897
+ */
898
+ void t_hs_generator::generate_service_server(t_service* tservice) {
899
+ // Generate the dispatch methods
900
+ vector<t_function*> functions = tservice->get_functions();
901
+ vector<t_function*>::iterator f_iter;
902
+
903
+ // Generate the process subfunctions
904
+ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
905
+ generate_process_function(tservice, *f_iter);
906
+ }
907
+
908
+
909
+ indent(f_service_) << "proc handler (iprot,oprot) (name,typ,seqid) = case name of" << endl;
910
+ indent_up();
911
+ for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
912
+ string fname = (*f_iter)->get_name();
913
+ indent(f_service_) << "\""<<fname<<"\" -> process_" << decapitalize(fname) << " (seqid,iprot,oprot,handler)" << endl;
914
+ }
915
+ indent(f_service_) << "_ -> ";
916
+ if(tservice->get_extends() != NULL){
917
+ f_service_ << type_name(tservice->get_extends()) << ".proc handler (iprot,oprot) (name,typ,seqid)" << endl;
918
+ } else {
919
+ f_service_ << "do" << endl;
920
+ indent_up();
921
+ indent(f_service_) << "skip iprot T_STRUCT" << endl;
922
+ indent(f_service_) << "readMessageEnd iprot" << endl;
923
+ indent(f_service_) << "writeMessageBegin oprot (name,M_EXCEPTION,seqid)" << endl;
924
+ indent(f_service_) << "writeAppExn oprot (AppExn AE_UNKNOWN_METHOD (\"Unknown function \" ++ name))" << endl;
925
+ indent(f_service_) << "writeMessageEnd oprot" << endl;
926
+ indent(f_service_) << "tFlush (getTransport oprot)" << endl;
927
+ indent_down();
928
+ }
929
+ indent_down();
930
+
931
+ // Generate the server implementation
932
+ indent(f_service_) <<
933
+ "process handler (iprot, oprot) = do" << endl;
934
+ indent_up();
935
+
936
+ f_service_ <<
937
+ indent() << "(name, typ, seqid) <- readMessageBegin iprot" << endl;
938
+ f_service_ << indent() << "proc handler (iprot,oprot) (name,typ,seqid)" << endl;
939
+ indent(f_service_) << "return True" << endl;
940
+ indent_down();
941
+
942
+ }
943
+
944
+ /**
945
+ * Generates a process function definition.
946
+ *
947
+ * @param tfunction The function to write a dispatcher for
948
+ */
949
+ void t_hs_generator::generate_process_function(t_service* tservice,
950
+ t_function* tfunction) {
951
+ // Open function
952
+ indent(f_service_) <<
953
+ "process_" << tfunction->get_name() << " (seqid, iprot, oprot, handler) = do" << endl;
954
+ indent_up();
955
+
956
+ string argsname = capitalize(tfunction->get_name()) + "_args";
957
+ string resultname = capitalize(tfunction->get_name()) + "_result";
958
+
959
+ // Generate the function call
960
+ t_struct* arg_struct = tfunction->get_arglist();
961
+ const std::vector<t_field*>& fields = arg_struct->get_members();
962
+ vector<t_field*>::const_iterator f_iter;
963
+
964
+
965
+ f_service_ <<
966
+ indent() << "args <- read_" << argsname << " iprot" << endl;
967
+ f_service_ <<
968
+ indent() << "readMessageEnd iprot" << endl;
969
+
970
+ t_struct* xs = tfunction->get_xceptions();
971
+ const std::vector<t_field*>& xceptions = xs->get_members();
972
+ vector<t_field*>::const_iterator x_iter;
973
+ int n = xceptions.size();
974
+ if (!tfunction->is_oneway()){
975
+ if(!tfunction->get_returntype()->is_void()){
976
+ n++;
977
+ }
978
+ indent(f_service_) << "rs <- return (" << resultname;
979
+
980
+ for(int i=0; i<n;i++){
981
+ f_service_ << " Nothing";
982
+ }
983
+ f_service_ << ")" << endl;
984
+ }
985
+
986
+ indent(f_service_) << "res <- ";
987
+ // Try block for a function with exceptions
988
+ if (xceptions.size() > 0) {
989
+ for(unsigned int i=0;i<xceptions.size();i++){
990
+ f_service_ << "(Control.Exception.catch" << endl;
991
+ indent_up();
992
+ f_service_ << indent();
993
+ }
994
+ }
995
+
996
+ f_service_ << "(do" << endl;
997
+ indent_up();
998
+ f_service_ << indent();
999
+ if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()){
1000
+ f_service_ << "res <- ";
1001
+ }
1002
+ f_service_ << "Iface." << tfunction->get_name() << " handler";
1003
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1004
+ f_service_ << " (f_" << argsname << "_" << (*f_iter)->get_name() << " args)";
1005
+ }
1006
+
1007
+
1008
+ if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()){
1009
+ f_service_ << endl;
1010
+ indent(f_service_) << "return rs{f_"<<resultname<<"_success= Just res}";
1011
+ } else if (!tfunction->is_oneway()){
1012
+ f_service_ << endl;
1013
+ indent(f_service_) << "return rs";
1014
+ }
1015
+ f_service_ << ")" << endl;
1016
+ indent_down();
1017
+
1018
+ if (xceptions.size() > 0 && !tfunction->is_oneway()) {
1019
+ for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
1020
+ indent(f_service_) << "(\\e -> " <<endl;
1021
+ indent_up();
1022
+ if(!tfunction->is_oneway()){
1023
+ f_service_ <<
1024
+ indent() << "return rs{f_"<<resultname<<"_" << (*x_iter)->get_name() << " =Just e}";
1025
+ } else {
1026
+ indent(f_service_) << "return ()";
1027
+ }
1028
+ f_service_ << "))" << endl;
1029
+ indent_down();
1030
+ indent_down();
1031
+ }
1032
+ }
1033
+
1034
+
1035
+
1036
+ // Shortcut out here for oneway functions
1037
+ if (tfunction->is_oneway()) {
1038
+ f_service_ <<
1039
+ indent() << "return ()" << endl;
1040
+ indent_down();
1041
+ return;
1042
+ }
1043
+
1044
+ f_service_ <<
1045
+ indent() << "writeMessageBegin oprot (\"" << tfunction->get_name() << "\", M_REPLY, seqid);" << endl <<
1046
+ indent() << "write_"<<resultname<<" oprot res" << endl <<
1047
+ indent() << "writeMessageEnd oprot" << endl <<
1048
+ indent() << "tFlush (getTransport oprot)" << endl;
1049
+
1050
+ // Close function
1051
+ indent_down();
1052
+ }
1053
+
1054
+ /**
1055
+ * Deserializes a field of any type.
1056
+ */
1057
+ void t_hs_generator::generate_deserialize_field(ofstream &out,
1058
+ t_field* tfield,
1059
+ string prefix){
1060
+ t_type* type = tfield->get_type();
1061
+ generate_deserialize_type(out,type);
1062
+ }
1063
+
1064
+
1065
+ /**
1066
+ * Deserializes a field of any type.
1067
+ */
1068
+ void t_hs_generator::generate_deserialize_type(ofstream &out,
1069
+ t_type* type){
1070
+ type = get_true_type(type);
1071
+
1072
+ if (type->is_void()) {
1073
+ throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE";
1074
+ }
1075
+
1076
+
1077
+ if (type->is_struct() || type->is_xception()) {
1078
+ generate_deserialize_struct(out,
1079
+ (t_struct*)type);
1080
+ } else if (type->is_container()) {
1081
+ generate_deserialize_container(out, type);
1082
+ } else if (type->is_base_type()) {
1083
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
1084
+ switch (tbase) {
1085
+ case t_base_type::TYPE_VOID:
1086
+ throw "compiler error: cannot serialize void field in a struct";
1087
+ break;
1088
+ case t_base_type::TYPE_STRING:
1089
+ out << "readString";
1090
+ break;
1091
+ case t_base_type::TYPE_BOOL:
1092
+ out << "readBool";
1093
+ break;
1094
+ case t_base_type::TYPE_BYTE:
1095
+ out << "readByte";
1096
+ break;
1097
+ case t_base_type::TYPE_I16:
1098
+ out << "readI16";
1099
+ break;
1100
+ case t_base_type::TYPE_I32:
1101
+ out << "readI32";
1102
+ break;
1103
+ case t_base_type::TYPE_I64:
1104
+ out << "readI64";
1105
+ break;
1106
+ case t_base_type::TYPE_DOUBLE:
1107
+ out << "readDouble";
1108
+ break;
1109
+ default:
1110
+ throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase);
1111
+ }
1112
+ out << " iprot";
1113
+ } else if (type->is_enum()) {
1114
+ string ename = capitalize(type->get_name());
1115
+ out << "(do {i <- readI32 iprot; return (toEnum i :: " << ename << ")})";
1116
+ } else {
1117
+ printf("DO NOT KNOW HOW TO DESERIALIZE TYPE '%s'\n",
1118
+ type->get_name().c_str());
1119
+ }
1120
+ }
1121
+
1122
+
1123
+ /**
1124
+ * Generates an unserializer for a struct, calling read()
1125
+ */
1126
+ void t_hs_generator::generate_deserialize_struct(ofstream &out,
1127
+ t_struct* tstruct) {
1128
+ string name = capitalize(tstruct->get_name());
1129
+ out << "(read_" << name << " iprot)";
1130
+
1131
+ }
1132
+
1133
+ /**
1134
+ * Serialize a container by writing out the header followed by
1135
+ * data and then a footer.
1136
+ */
1137
+ void t_hs_generator::generate_deserialize_container(ofstream &out,
1138
+ t_type* ttype) {
1139
+ string size = tmp("_size");
1140
+ string ktype = tmp("_ktype");
1141
+ string vtype = tmp("_vtype");
1142
+ string etype = tmp("_etype");
1143
+ string con = tmp("_con");
1144
+
1145
+ t_field fsize(g_type_i32, size);
1146
+ t_field fktype(g_type_byte, ktype);
1147
+ t_field fvtype(g_type_byte, vtype);
1148
+ t_field fetype(g_type_byte, etype);
1149
+
1150
+ // Declare variables, read header
1151
+ if (ttype->is_map()) {
1152
+ out << "(let {f 0 = return []; f n = do {k <- ";
1153
+ generate_deserialize_type(out,((t_map*)ttype)->get_key_type());
1154
+ out << "; v <- ";
1155
+ generate_deserialize_type(out,((t_map*)ttype)->get_val_type());
1156
+ out << ";r <- f (n-1); return $ (k,v):r}} in do {("<<ktype<<","<<vtype<<","<<size<<") <- readMapBegin iprot; l <- f " << size << "; return $ Map.fromList l})";
1157
+ } else if (ttype->is_set()) {
1158
+ out << "(let {f 0 = return []; f n = do {v <- ";
1159
+ generate_deserialize_type(out,((t_map*)ttype)->get_key_type());
1160
+ out << ";r <- f (n-1); return $ v:r}} in do {("<<etype<<","<<size<<") <- readSetBegin iprot; l <- f " << size << "; return $ Set.fromList l})";
1161
+ } else if (ttype->is_list()) {
1162
+ out << "(let {f 0 = return []; f n = do {v <- ";
1163
+ generate_deserialize_type(out,((t_map*)ttype)->get_key_type());
1164
+ out << ";r <- f (n-1); return $ v:r}} in do {("<<etype<<","<<size<<") <- readListBegin iprot; f " << size << "})";
1165
+ }
1166
+ }
1167
+
1168
+
1169
+ /**
1170
+ * Serializes a field of any type.
1171
+ *
1172
+ * @param tfield The field to serialize
1173
+ * @param prefix Name to prepend to field name
1174
+ */
1175
+ void t_hs_generator::generate_serialize_field(ofstream &out,
1176
+ t_field* tfield,
1177
+ string name) {
1178
+ t_type* type = get_true_type(tfield->get_type());
1179
+
1180
+ // Do nothing for void types
1181
+ if (type->is_void()) {
1182
+ throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " +
1183
+ tfield->get_name();
1184
+ }
1185
+
1186
+ if(name.length() == 0){
1187
+ name = decapitalize(tfield->get_name());
1188
+ }
1189
+
1190
+ if (type->is_struct() || type->is_xception()) {
1191
+ generate_serialize_struct(out,
1192
+ (t_struct*)type,
1193
+ name);
1194
+ } else if (type->is_container()) {
1195
+ generate_serialize_container(out,
1196
+ type,
1197
+ name);
1198
+ } else if (type->is_base_type() || type->is_enum()) {
1199
+ if (type->is_base_type()) {
1200
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
1201
+ switch (tbase) {
1202
+ case t_base_type::TYPE_VOID:
1203
+ throw
1204
+ "compiler error: cannot serialize void field in a struct: " + name;
1205
+ break;
1206
+ case t_base_type::TYPE_STRING:
1207
+ out << "writeString oprot " << name;
1208
+ break;
1209
+ case t_base_type::TYPE_BOOL:
1210
+ out << "writeBool oprot " << name;
1211
+ break;
1212
+ case t_base_type::TYPE_BYTE:
1213
+ out << "writeByte oprot " << name;
1214
+ break;
1215
+ case t_base_type::TYPE_I16:
1216
+ out << "writeI16 oprot " << name;
1217
+ break;
1218
+ case t_base_type::TYPE_I32:
1219
+ out << "writeI32 oprot " << name;
1220
+ break;
1221
+ case t_base_type::TYPE_I64:
1222
+ out << "writeI64 oprot " << name;
1223
+ break;
1224
+ case t_base_type::TYPE_DOUBLE:
1225
+ out << "writeDouble oprot " << name;
1226
+ break;
1227
+ default:
1228
+ throw "compiler error: no hs name for base type " + t_base_type::t_base_name(tbase);
1229
+ }
1230
+
1231
+ } else if (type->is_enum()) {
1232
+ string ename = capitalize(type->get_name());
1233
+ out << "writeI32 oprot (fromEnum "<< name << ")";
1234
+ }
1235
+
1236
+ } else {
1237
+ printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s' TYPE '%s'\n",
1238
+ tfield->get_name().c_str(),
1239
+ type->get_name().c_str());
1240
+ }
1241
+ }
1242
+
1243
+ /**
1244
+ * Serializes all the members of a struct.
1245
+ *
1246
+ * @param tstruct The struct to serialize
1247
+ * @param prefix String prefix to attach to all fields
1248
+ */
1249
+ void t_hs_generator::generate_serialize_struct(ofstream &out,
1250
+ t_struct* tstruct,
1251
+ string prefix) {
1252
+ out << "write_" << type_name(tstruct) << " oprot " << prefix;
1253
+ }
1254
+
1255
+ void t_hs_generator::generate_serialize_container(ofstream &out,
1256
+ t_type* ttype,
1257
+ string prefix) {
1258
+ if (ttype->is_map()) {
1259
+ string k = tmp("_kiter");
1260
+ string v = tmp("_viter");
1261
+ out << "(let {f [] = return (); f (("<<k<<","<<v<<"):t) = do {";
1262
+ generate_serialize_map_element(out, (t_map*)ttype, k, v);
1263
+ out << ";f t}} in do {writeMapBegin oprot ("<< type_to_enum(((t_map*)ttype)->get_key_type())<<","<< type_to_enum(((t_map*)ttype)->get_val_type())<<",Map.size " << prefix << "); f (Map.toList " << prefix << ");writeMapEnd oprot})";
1264
+ } else if (ttype->is_set()) {
1265
+ string v = tmp("_viter");
1266
+ out << "(let {f [] = return (); f ("<<v<<":t) = do {";
1267
+ generate_serialize_set_element(out, (t_set*)ttype, v);
1268
+ out << ";f t}} in do {writeSetBegin oprot ("<< type_to_enum(((t_set*)ttype)->get_elem_type())<<",Set.size " << prefix << "); f (Set.toList " << prefix << ");writeSetEnd oprot})";
1269
+ } else if (ttype->is_list()) {
1270
+ string v = tmp("_viter");
1271
+ out << "(let {f [] = return (); f ("<<v<<":t) = do {";
1272
+ generate_serialize_list_element(out, (t_list*)ttype, v);
1273
+ out << ";f t}} in do {writeListBegin oprot ("<< type_to_enum(((t_list*)ttype)->get_elem_type())<<",length " << prefix << "); f " << prefix << ";writeListEnd oprot})";
1274
+ }
1275
+
1276
+ }
1277
+
1278
+ /**
1279
+ * Serializes the members of a map.
1280
+ *
1281
+ */
1282
+ void t_hs_generator::generate_serialize_map_element(ofstream &out,
1283
+ t_map* tmap,
1284
+ string kiter,
1285
+ string viter) {
1286
+ t_field kfield(tmap->get_key_type(), kiter);
1287
+ out << "do {";
1288
+ generate_serialize_field(out, &kfield);
1289
+ out << ";";
1290
+ t_field vfield(tmap->get_val_type(), viter);
1291
+ generate_serialize_field(out, &vfield);
1292
+ out << "}";
1293
+ }
1294
+
1295
+ /**
1296
+ * Serializes the members of a set.
1297
+ */
1298
+ void t_hs_generator::generate_serialize_set_element(ofstream &out,
1299
+ t_set* tset,
1300
+ string iter) {
1301
+ t_field efield(tset->get_elem_type(), iter);
1302
+ generate_serialize_field(out, &efield);
1303
+ }
1304
+
1305
+ /**
1306
+ * Serializes the members of a list.
1307
+ */
1308
+ void t_hs_generator::generate_serialize_list_element(ofstream &out,
1309
+ t_list* tlist,
1310
+ string iter) {
1311
+ t_field efield(tlist->get_elem_type(), iter);
1312
+ generate_serialize_field(out, &efield);
1313
+ }
1314
+
1315
+
1316
+ string t_hs_generator::function_type(t_function* tfunc, bool options, bool io, bool method){
1317
+ string result="";
1318
+
1319
+ const vector<t_field*>& fields = tfunc->get_arglist()->get_members();
1320
+ vector<t_field*>::const_iterator f_iter;
1321
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
1322
+ if(options) result += "Maybe ";
1323
+ result += render_hs_type((*f_iter)->get_type(), options);
1324
+ result += " -> ";
1325
+ }
1326
+ if(fields.empty() && !method){
1327
+ result += "() -> ";
1328
+ }
1329
+ if(io) result += "IO ";
1330
+ result += render_hs_type(tfunc->get_returntype(), io);
1331
+ return result;
1332
+ }
1333
+
1334
+
1335
+ string t_hs_generator::type_name(t_type* ttype) {
1336
+ string prefix = "";
1337
+ t_program* program = ttype->get_program();
1338
+ if (program != NULL && program != program_) {
1339
+ if (!ttype->is_service()) {
1340
+ prefix = capitalize(program->get_name()) + "_Types.";
1341
+ }
1342
+ }
1343
+
1344
+ string name = ttype->get_name();
1345
+ if(ttype->is_service()){
1346
+ name = capitalize(name);
1347
+ } else {
1348
+ name = capitalize(name);
1349
+ }
1350
+ return prefix + name;
1351
+ }
1352
+
1353
+ /**
1354
+ * Converts the parse type to a Protocol.t_type enum
1355
+ */
1356
+ string t_hs_generator::type_to_enum(t_type* type) {
1357
+ type = get_true_type(type);
1358
+
1359
+ if (type->is_base_type()) {
1360
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
1361
+ switch (tbase) {
1362
+ case t_base_type::TYPE_VOID:
1363
+ return "T_VOID";
1364
+ case t_base_type::TYPE_STRING:
1365
+ return "T_STRING";
1366
+ case t_base_type::TYPE_BOOL:
1367
+ return "T_BOOL";
1368
+ case t_base_type::TYPE_BYTE:
1369
+ return "T_BYTE";
1370
+ case t_base_type::TYPE_I16:
1371
+ return "T_I16";
1372
+ case t_base_type::TYPE_I32:
1373
+ return "T_I32";
1374
+ case t_base_type::TYPE_I64:
1375
+ return "T_I64";
1376
+ case t_base_type::TYPE_DOUBLE:
1377
+ return "T_DOUBLE";
1378
+ }
1379
+ } else if (type->is_enum()) {
1380
+ return "T_I32";
1381
+ } else if (type->is_struct() || type->is_xception()) {
1382
+ return "T_STRUCT";
1383
+ } else if (type->is_map()) {
1384
+ return "T_MAP";
1385
+ } else if (type->is_set()) {
1386
+ return "T_SET";
1387
+ } else if (type->is_list()) {
1388
+ return "T_LIST";
1389
+ }
1390
+
1391
+ throw "INVALID TYPE IN type_to_enum: " + type->get_name();
1392
+ }
1393
+
1394
+ /**
1395
+ * Converts the parse type to an haskell type
1396
+ */
1397
+ string t_hs_generator::render_hs_type(t_type* type, bool needs_parens) {
1398
+ type = get_true_type(type);
1399
+ string type_repr;
1400
+
1401
+ if (type->is_base_type()) {
1402
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
1403
+ switch (tbase) {
1404
+ case t_base_type::TYPE_VOID:
1405
+ return "()";
1406
+ case t_base_type::TYPE_STRING:
1407
+ return "String";
1408
+ case t_base_type::TYPE_BOOL:
1409
+ return "Bool";
1410
+ case t_base_type::TYPE_BYTE:
1411
+ return "Int";
1412
+ case t_base_type::TYPE_I16:
1413
+ return "Int";
1414
+ case t_base_type::TYPE_I32:
1415
+ return "Int";
1416
+ case t_base_type::TYPE_I64:
1417
+ return "Int64";
1418
+ case t_base_type::TYPE_DOUBLE:
1419
+ return "Double";
1420
+ }
1421
+ } else if (type->is_enum()) {
1422
+ return capitalize(((t_enum*)type)->get_name());
1423
+ } else if (type->is_struct() || type->is_xception()) {
1424
+ return type_name((t_struct*)type);
1425
+ } else if (type->is_map()) {
1426
+ t_type* ktype = ((t_map*)type)->get_key_type();
1427
+ t_type* vtype = ((t_map*)type)->get_val_type();
1428
+
1429
+ type_repr = "Map.Map " + render_hs_type(ktype, true) + " " + render_hs_type(vtype, true);
1430
+ } else if (type->is_set()) {
1431
+ t_type* etype = ((t_set*)type)->get_elem_type();
1432
+
1433
+ type_repr = "Set.Set " + render_hs_type(etype, true) ;
1434
+ } else if (type->is_list()) {
1435
+ t_type* etype = ((t_list*)type)->get_elem_type();
1436
+ return "[" + render_hs_type(etype, false) + "]";
1437
+ } else {
1438
+ throw "INVALID TYPE IN type_to_enum: " + type->get_name();
1439
+ }
1440
+
1441
+ return needs_parens ? "(" + type_repr + ")" : type_repr;
1442
+ }
1443
+
1444
+
1445
+ THRIFT_REGISTER_GENERATOR(hs, "Haskell", "");