temporalio 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (469) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +4035 -0
  3. data/Cargo.toml +25 -0
  4. data/Gemfile +20 -0
  5. data/LICENSE +16 -15
  6. data/README.md +455 -195
  7. data/Rakefile +387 -0
  8. data/ext/Cargo.toml +25 -0
  9. data/lib/temporalio/activity/complete_async_error.rb +11 -0
  10. data/lib/temporalio/activity/context.rb +82 -77
  11. data/lib/temporalio/activity/definition.rb +77 -0
  12. data/lib/temporalio/activity/info.rb +42 -46
  13. data/lib/temporalio/activity.rb +49 -65
  14. data/lib/temporalio/api/batch/v1/message.rb +31 -0
  15. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +93 -0
  16. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
  17. data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
  18. data/lib/temporalio/api/cloud/identity/v1/message.rb +36 -0
  19. data/lib/temporalio/api/cloud/namespace/v1/message.rb +35 -0
  20. data/lib/temporalio/api/cloud/operation/v1/message.rb +27 -0
  21. data/lib/temporalio/api/cloud/region/v1/message.rb +23 -0
  22. data/lib/temporalio/api/command/v1/message.rb +46 -0
  23. data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
  24. data/lib/temporalio/api/common/v1/message.rb +41 -0
  25. data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
  26. data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
  27. data/lib/temporalio/api/enums/v1/common.rb +26 -0
  28. data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
  29. data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
  30. data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
  31. data/lib/temporalio/api/enums/v1/query.rb +22 -0
  32. data/lib/temporalio/api/enums/v1/reset.rb +23 -0
  33. data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
  34. data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
  35. data/lib/temporalio/api/enums/v1/update.rb +22 -0
  36. data/lib/temporalio/api/enums/v1/workflow.rb +30 -0
  37. data/lib/temporalio/api/errordetails/v1/message.rb +42 -0
  38. data/lib/temporalio/api/export/v1/message.rb +24 -0
  39. data/lib/temporalio/api/failure/v1/message.rb +35 -0
  40. data/lib/temporalio/api/filter/v1/message.rb +27 -0
  41. data/lib/temporalio/api/history/v1/message.rb +90 -0
  42. data/lib/temporalio/api/namespace/v1/message.rb +31 -0
  43. data/lib/temporalio/api/nexus/v1/message.rb +40 -0
  44. data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
  45. data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
  46. data/lib/temporalio/api/operatorservice.rb +3 -0
  47. data/lib/temporalio/api/protocol/v1/message.rb +23 -0
  48. data/lib/temporalio/api/query/v1/message.rb +27 -0
  49. data/lib/temporalio/api/replication/v1/message.rb +26 -0
  50. data/lib/temporalio/api/schedule/v1/message.rb +42 -0
  51. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
  52. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
  53. data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
  54. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
  55. data/lib/temporalio/api/taskqueue/v1/message.rb +45 -0
  56. data/lib/temporalio/api/update/v1/message.rb +33 -0
  57. data/lib/temporalio/api/version/v1/message.rb +26 -0
  58. data/lib/temporalio/api/workflow/v1/message.rb +43 -0
  59. data/lib/temporalio/api/workflowservice/v1/request_response.rb +189 -0
  60. data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
  61. data/lib/temporalio/api/workflowservice.rb +3 -0
  62. data/lib/temporalio/api.rb +13 -0
  63. data/lib/temporalio/cancellation.rb +150 -0
  64. data/lib/temporalio/client/activity_id_reference.rb +32 -0
  65. data/lib/temporalio/client/async_activity_handle.rb +110 -0
  66. data/lib/temporalio/client/connection/cloud_service.rb +648 -0
  67. data/lib/temporalio/client/connection/operator_service.rb +249 -0
  68. data/lib/temporalio/client/connection/service.rb +41 -0
  69. data/lib/temporalio/client/connection/workflow_service.rb +1218 -0
  70. data/lib/temporalio/client/connection.rb +270 -0
  71. data/lib/temporalio/client/interceptor.rb +316 -0
  72. data/lib/temporalio/client/workflow_execution.rb +103 -0
  73. data/lib/temporalio/client/workflow_execution_count.rb +36 -0
  74. data/lib/temporalio/client/workflow_execution_status.rb +18 -0
  75. data/lib/temporalio/client/workflow_handle.rb +380 -177
  76. data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
  77. data/lib/temporalio/client/workflow_update_handle.rb +67 -0
  78. data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
  79. data/lib/temporalio/client.rb +366 -93
  80. data/lib/temporalio/common_enums.rb +24 -0
  81. data/lib/temporalio/converters/data_converter.rb +102 -0
  82. data/lib/temporalio/converters/failure_converter.rb +200 -0
  83. data/lib/temporalio/converters/payload_codec.rb +26 -0
  84. data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
  85. data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
  86. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
  87. data/lib/temporalio/converters/payload_converter/composite.rb +62 -0
  88. data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
  89. data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
  90. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
  91. data/lib/temporalio/converters/payload_converter.rb +73 -0
  92. data/lib/temporalio/converters.rb +9 -0
  93. data/lib/temporalio/error/failure.rb +119 -94
  94. data/lib/temporalio/error.rb +147 -0
  95. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
  96. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +31 -0
  97. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
  98. data/lib/temporalio/internal/bridge/api/common/common.rb +26 -0
  99. data/lib/temporalio/internal/bridge/api/core_interface.rb +36 -0
  100. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
  101. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +52 -0
  102. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +54 -0
  103. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +30 -0
  104. data/lib/temporalio/internal/bridge/api.rb +3 -0
  105. data/lib/temporalio/internal/bridge/client.rb +90 -0
  106. data/lib/temporalio/internal/bridge/runtime.rb +53 -0
  107. data/lib/temporalio/internal/bridge/testing.rb +46 -0
  108. data/lib/temporalio/internal/bridge/worker.rb +83 -0
  109. data/lib/temporalio/internal/bridge.rb +36 -0
  110. data/lib/temporalio/internal/client/implementation.rb +525 -0
  111. data/lib/temporalio/internal/proto_utils.rb +54 -0
  112. data/lib/temporalio/internal/worker/activity_worker.rb +345 -0
  113. data/lib/temporalio/internal/worker/multi_runner.rb +169 -0
  114. data/lib/temporalio/internal.rb +7 -0
  115. data/lib/temporalio/retry_policy.rb +39 -80
  116. data/lib/temporalio/runtime.rb +259 -13
  117. data/lib/temporalio/scoped_logger.rb +96 -0
  118. data/lib/temporalio/search_attributes.rb +300 -0
  119. data/lib/temporalio/testing/activity_environment.rb +132 -0
  120. data/lib/temporalio/testing/workflow_environment.rb +113 -88
  121. data/lib/temporalio/testing.rb +4 -169
  122. data/lib/temporalio/version.rb +3 -1
  123. data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
  124. data/lib/temporalio/worker/activity_executor/thread_pool.rb +254 -0
  125. data/lib/temporalio/worker/activity_executor.rb +55 -0
  126. data/lib/temporalio/worker/interceptor.rb +88 -0
  127. data/lib/temporalio/worker/tuner.rb +151 -0
  128. data/lib/temporalio/worker.rb +385 -163
  129. data/lib/temporalio/workflow_history.rb +22 -0
  130. data/lib/temporalio.rb +2 -7
  131. data/temporalio.gemspec +20 -38
  132. metadata +131 -596
  133. data/bridge/Cargo.lock +0 -2997
  134. data/bridge/Cargo.toml +0 -29
  135. data/bridge/sdk-core/ARCHITECTURE.md +0 -76
  136. data/bridge/sdk-core/Cargo.toml +0 -2
  137. data/bridge/sdk-core/LICENSE.txt +0 -23
  138. data/bridge/sdk-core/README.md +0 -117
  139. data/bridge/sdk-core/arch_docs/diagrams/README.md +0 -10
  140. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +0 -40
  141. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +0 -1
  142. data/bridge/sdk-core/arch_docs/sticky_queues.md +0 -51
  143. data/bridge/sdk-core/client/Cargo.toml +0 -40
  144. data/bridge/sdk-core/client/LICENSE.txt +0 -23
  145. data/bridge/sdk-core/client/src/lib.rs +0 -1462
  146. data/bridge/sdk-core/client/src/metrics.rs +0 -174
  147. data/bridge/sdk-core/client/src/raw.rs +0 -932
  148. data/bridge/sdk-core/client/src/retry.rs +0 -763
  149. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +0 -185
  150. data/bridge/sdk-core/core/Cargo.toml +0 -129
  151. data/bridge/sdk-core/core/LICENSE.txt +0 -23
  152. data/bridge/sdk-core/core/benches/workflow_replay.rs +0 -76
  153. data/bridge/sdk-core/core/src/abstractions.rs +0 -355
  154. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +0 -1049
  155. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +0 -221
  156. data/bridge/sdk-core/core/src/core_tests/determinism.rs +0 -270
  157. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +0 -1046
  158. data/bridge/sdk-core/core/src/core_tests/mod.rs +0 -100
  159. data/bridge/sdk-core/core/src/core_tests/queries.rs +0 -893
  160. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +0 -65
  161. data/bridge/sdk-core/core/src/core_tests/workers.rs +0 -257
  162. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +0 -124
  163. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +0 -2433
  164. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +0 -609
  165. data/bridge/sdk-core/core/src/internal_flags.rs +0 -136
  166. data/bridge/sdk-core/core/src/lib.rs +0 -289
  167. data/bridge/sdk-core/core/src/pollers/mod.rs +0 -54
  168. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +0 -297
  169. data/bridge/sdk-core/core/src/protosext/mod.rs +0 -428
  170. data/bridge/sdk-core/core/src/replay/mod.rs +0 -215
  171. data/bridge/sdk-core/core/src/retry_logic.rs +0 -202
  172. data/bridge/sdk-core/core/src/telemetry/log_export.rs +0 -190
  173. data/bridge/sdk-core/core/src/telemetry/metrics.rs +0 -462
  174. data/bridge/sdk-core/core/src/telemetry/mod.rs +0 -423
  175. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +0 -83
  176. data/bridge/sdk-core/core/src/test_help/mod.rs +0 -939
  177. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +0 -536
  178. data/bridge/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +0 -89
  179. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +0 -1278
  180. data/bridge/sdk-core/core/src/worker/activities.rs +0 -557
  181. data/bridge/sdk-core/core/src/worker/client/mocks.rs +0 -107
  182. data/bridge/sdk-core/core/src/worker/client.rs +0 -389
  183. data/bridge/sdk-core/core/src/worker/mod.rs +0 -677
  184. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +0 -35
  185. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +0 -99
  186. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +0 -1111
  187. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +0 -964
  188. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +0 -294
  189. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +0 -168
  190. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +0 -918
  191. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +0 -137
  192. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +0 -158
  193. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +0 -130
  194. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +0 -1525
  195. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +0 -324
  196. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -179
  197. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +0 -659
  198. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +0 -439
  199. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +0 -435
  200. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +0 -175
  201. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +0 -249
  202. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +0 -85
  203. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +0 -1280
  204. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +0 -269
  205. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +0 -213
  206. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +0 -1305
  207. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +0 -1276
  208. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +0 -128
  209. data/bridge/sdk-core/core/src/worker/workflow/wft_extraction.rs +0 -125
  210. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +0 -85
  211. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +0 -117
  212. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +0 -24
  213. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +0 -715
  214. data/bridge/sdk-core/core-api/Cargo.toml +0 -33
  215. data/bridge/sdk-core/core-api/LICENSE.txt +0 -23
  216. data/bridge/sdk-core/core-api/src/errors.rs +0 -62
  217. data/bridge/sdk-core/core-api/src/lib.rs +0 -113
  218. data/bridge/sdk-core/core-api/src/telemetry.rs +0 -141
  219. data/bridge/sdk-core/core-api/src/worker.rs +0 -161
  220. data/bridge/sdk-core/etc/deps.svg +0 -162
  221. data/bridge/sdk-core/etc/dynamic-config.yaml +0 -2
  222. data/bridge/sdk-core/etc/otel-collector-config.yaml +0 -36
  223. data/bridge/sdk-core/etc/prometheus.yaml +0 -6
  224. data/bridge/sdk-core/etc/regen-depgraph.sh +0 -5
  225. data/bridge/sdk-core/fsm/Cargo.toml +0 -18
  226. data/bridge/sdk-core/fsm/LICENSE.txt +0 -23
  227. data/bridge/sdk-core/fsm/README.md +0 -3
  228. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +0 -27
  229. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +0 -23
  230. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +0 -650
  231. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +0 -8
  232. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +0 -18
  233. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +0 -12
  234. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +0 -41
  235. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +0 -14
  236. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +0 -11
  237. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +0 -32
  238. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +0 -31
  239. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +0 -46
  240. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +0 -29
  241. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +0 -12
  242. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +0 -32
  243. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +0 -18
  244. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +0 -5
  245. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +0 -11
  246. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +0 -5
  247. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +0 -11
  248. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +0 -5
  249. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +0 -14
  250. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +0 -23
  251. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +0 -254
  252. data/bridge/sdk-core/fsm/src/lib.rs +0 -2
  253. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-16_history.bin +0 -0
  254. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  255. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  256. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  257. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  258. data/bridge/sdk-core/integ-with-otel.sh +0 -7
  259. data/bridge/sdk-core/protos/api_upstream/README.md +0 -9
  260. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +0 -40
  261. data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -9
  262. data/bridge/sdk-core/protos/api_upstream/build/go.mod +0 -7
  263. data/bridge/sdk-core/protos/api_upstream/build/go.sum +0 -5
  264. data/bridge/sdk-core/protos/api_upstream/build/tools.go +0 -29
  265. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +0 -141
  266. data/bridge/sdk-core/protos/api_upstream/go.mod +0 -6
  267. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +0 -89
  268. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +0 -248
  269. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +0 -123
  270. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -47
  271. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +0 -52
  272. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +0 -56
  273. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +0 -170
  274. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +0 -123
  275. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +0 -51
  276. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +0 -50
  277. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +0 -41
  278. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +0 -60
  279. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -59
  280. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +0 -56
  281. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +0 -122
  282. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +0 -108
  283. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +0 -114
  284. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +0 -56
  285. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +0 -787
  286. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +0 -99
  287. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +0 -124
  288. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +0 -80
  289. data/bridge/sdk-core/protos/api_upstream/temporal/api/protocol/v1/message.proto +0 -57
  290. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +0 -61
  291. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +0 -55
  292. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +0 -379
  293. data/bridge/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +0 -63
  294. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +0 -108
  295. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +0 -111
  296. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +0 -59
  297. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +0 -146
  298. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +0 -1199
  299. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +0 -415
  300. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +0 -63
  301. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +0 -79
  302. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +0 -80
  303. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +0 -78
  304. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +0 -16
  305. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +0 -31
  306. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +0 -31
  307. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +0 -270
  308. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +0 -305
  309. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +0 -35
  310. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +0 -38
  311. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +0 -13
  312. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +0 -141
  313. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +0 -63
  314. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +0 -90
  315. data/bridge/sdk-core/rustfmt.toml +0 -1
  316. data/bridge/sdk-core/sdk/Cargo.toml +0 -48
  317. data/bridge/sdk-core/sdk/LICENSE.txt +0 -23
  318. data/bridge/sdk-core/sdk/src/activity_context.rs +0 -230
  319. data/bridge/sdk-core/sdk/src/app_data.rs +0 -37
  320. data/bridge/sdk-core/sdk/src/interceptors.rs +0 -50
  321. data/bridge/sdk-core/sdk/src/lib.rs +0 -861
  322. data/bridge/sdk-core/sdk/src/payload_converter.rs +0 -11
  323. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +0 -295
  324. data/bridge/sdk-core/sdk/src/workflow_context.rs +0 -694
  325. data/bridge/sdk-core/sdk/src/workflow_future.rs +0 -500
  326. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +0 -33
  327. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +0 -23
  328. data/bridge/sdk-core/sdk-core-protos/build.rs +0 -142
  329. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +0 -7
  330. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +0 -557
  331. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +0 -234
  332. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +0 -2088
  333. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +0 -48
  334. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +0 -14
  335. data/bridge/sdk-core/test-utils/Cargo.toml +0 -38
  336. data/bridge/sdk-core/test-utils/src/canned_histories.rs +0 -1389
  337. data/bridge/sdk-core/test-utils/src/histfetch.rs +0 -28
  338. data/bridge/sdk-core/test-utils/src/lib.rs +0 -709
  339. data/bridge/sdk-core/test-utils/src/wf_input_saver.rs +0 -50
  340. data/bridge/sdk-core/test-utils/src/workflows.rs +0 -29
  341. data/bridge/sdk-core/tests/fuzzy_workflow.rs +0 -130
  342. data/bridge/sdk-core/tests/heavy_tests.rs +0 -265
  343. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +0 -36
  344. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +0 -150
  345. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +0 -223
  346. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +0 -239
  347. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +0 -90
  348. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +0 -314
  349. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +0 -151
  350. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +0 -902
  351. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
  352. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +0 -60
  353. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +0 -51
  354. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +0 -51
  355. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +0 -64
  356. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +0 -47
  357. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +0 -669
  358. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +0 -54
  359. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +0 -92
  360. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +0 -228
  361. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +0 -94
  362. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +0 -171
  363. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +0 -85
  364. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +0 -120
  365. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +0 -77
  366. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +0 -596
  367. data/bridge/sdk-core/tests/main.rs +0 -103
  368. data/bridge/sdk-core/tests/runner.rs +0 -132
  369. data/bridge/sdk-core/tests/wf_input_replay.rs +0 -32
  370. data/bridge/src/connection.rs +0 -202
  371. data/bridge/src/lib.rs +0 -494
  372. data/bridge/src/runtime.rs +0 -54
  373. data/bridge/src/test_server.rs +0 -153
  374. data/bridge/src/worker.rs +0 -197
  375. data/ext/Rakefile +0 -9
  376. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +0 -14
  377. data/lib/gen/temporal/api/batch/v1/message_pb.rb +0 -50
  378. data/lib/gen/temporal/api/command/v1/message_pb.rb +0 -160
  379. data/lib/gen/temporal/api/common/v1/message_pb.rb +0 -73
  380. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +0 -33
  381. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +0 -37
  382. data/lib/gen/temporal/api/enums/v1/common_pb.rb +0 -42
  383. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +0 -68
  384. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +0 -79
  385. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +0 -37
  386. data/lib/gen/temporal/api/enums/v1/query_pb.rb +0 -31
  387. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +0 -24
  388. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +0 -28
  389. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +0 -30
  390. data/lib/gen/temporal/api/enums/v1/update_pb.rb +0 -25
  391. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +0 -89
  392. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +0 -84
  393. data/lib/gen/temporal/api/failure/v1/message_pb.rb +0 -83
  394. data/lib/gen/temporal/api/filter/v1/message_pb.rb +0 -40
  395. data/lib/gen/temporal/api/history/v1/message_pb.rb +0 -498
  396. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +0 -64
  397. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +0 -88
  398. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +0 -20
  399. data/lib/gen/temporal/api/protocol/v1/message_pb.rb +0 -30
  400. data/lib/gen/temporal/api/query/v1/message_pb.rb +0 -38
  401. data/lib/gen/temporal/api/replication/v1/message_pb.rb +0 -37
  402. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +0 -149
  403. data/lib/gen/temporal/api/sdk/v1/task_complete_metadata_pb.rb +0 -23
  404. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +0 -73
  405. data/lib/gen/temporal/api/testservice/v1/request_response_pb.rb +0 -49
  406. data/lib/gen/temporal/api/testservice/v1/service_pb.rb +0 -21
  407. data/lib/gen/temporal/api/update/v1/message_pb.rb +0 -72
  408. data/lib/gen/temporal/api/version/v1/message_pb.rb +0 -41
  409. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +0 -111
  410. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +0 -798
  411. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +0 -20
  412. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +0 -62
  413. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +0 -61
  414. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +0 -61
  415. data/lib/gen/temporal/sdk/core/common/common_pb.rb +0 -26
  416. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +0 -40
  417. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +0 -31
  418. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +0 -171
  419. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +0 -200
  420. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +0 -41
  421. data/lib/temporalio/bridge/connect_options.rb +0 -15
  422. data/lib/temporalio/bridge/error.rb +0 -8
  423. data/lib/temporalio/bridge/retry_config.rb +0 -24
  424. data/lib/temporalio/bridge/tls_options.rb +0 -19
  425. data/lib/temporalio/bridge.rb +0 -14
  426. data/lib/temporalio/client/implementation.rb +0 -340
  427. data/lib/temporalio/connection/retry_config.rb +0 -44
  428. data/lib/temporalio/connection/service.rb +0 -20
  429. data/lib/temporalio/connection/test_service.rb +0 -92
  430. data/lib/temporalio/connection/tls_options.rb +0 -51
  431. data/lib/temporalio/connection/workflow_service.rb +0 -731
  432. data/lib/temporalio/connection.rb +0 -86
  433. data/lib/temporalio/data_converter.rb +0 -191
  434. data/lib/temporalio/error/workflow_failure.rb +0 -19
  435. data/lib/temporalio/errors.rb +0 -40
  436. data/lib/temporalio/failure_converter/base.rb +0 -26
  437. data/lib/temporalio/failure_converter/basic.rb +0 -319
  438. data/lib/temporalio/failure_converter.rb +0 -7
  439. data/lib/temporalio/interceptor/activity_inbound.rb +0 -22
  440. data/lib/temporalio/interceptor/activity_outbound.rb +0 -24
  441. data/lib/temporalio/interceptor/chain.rb +0 -28
  442. data/lib/temporalio/interceptor/client.rb +0 -127
  443. data/lib/temporalio/interceptor.rb +0 -22
  444. data/lib/temporalio/payload_codec/base.rb +0 -32
  445. data/lib/temporalio/payload_converter/base.rb +0 -24
  446. data/lib/temporalio/payload_converter/bytes.rb +0 -27
  447. data/lib/temporalio/payload_converter/composite.rb +0 -49
  448. data/lib/temporalio/payload_converter/encoding_base.rb +0 -35
  449. data/lib/temporalio/payload_converter/json.rb +0 -26
  450. data/lib/temporalio/payload_converter/nil.rb +0 -26
  451. data/lib/temporalio/payload_converter.rb +0 -14
  452. data/lib/temporalio/retry_state.rb +0 -35
  453. data/lib/temporalio/testing/time_skipping_handle.rb +0 -32
  454. data/lib/temporalio/testing/time_skipping_interceptor.rb +0 -23
  455. data/lib/temporalio/timeout_type.rb +0 -29
  456. data/lib/temporalio/worker/activity_runner.rb +0 -114
  457. data/lib/temporalio/worker/activity_worker.rb +0 -164
  458. data/lib/temporalio/worker/reactor.rb +0 -46
  459. data/lib/temporalio/worker/runner.rb +0 -63
  460. data/lib/temporalio/worker/sync_worker.rb +0 -124
  461. data/lib/temporalio/worker/thread_pool_executor.rb +0 -51
  462. data/lib/temporalio/workflow/async.rb +0 -46
  463. data/lib/temporalio/workflow/execution_info.rb +0 -54
  464. data/lib/temporalio/workflow/execution_status.rb +0 -36
  465. data/lib/temporalio/workflow/future.rb +0 -138
  466. data/lib/temporalio/workflow/id_reuse_policy.rb +0 -36
  467. data/lib/temporalio/workflow/info.rb +0 -76
  468. data/lib/temporalio/workflow/query_reject_condition.rb +0 -33
  469. data/lib/thermite_patch.rb +0 -23
@@ -1,650 +0,0 @@
1
- use proc_macro::TokenStream;
2
- use quote::{quote, quote_spanned};
3
- use std::collections::{hash_map::Entry, HashMap, HashSet};
4
- use syn::{
5
- parenthesized,
6
- parse::{Parse, ParseStream, Result},
7
- parse_macro_input,
8
- punctuated::Punctuated,
9
- spanned::Spanned,
10
- Error, Fields, Ident, Token, Type, Variant, Visibility,
11
- };
12
-
13
- /// Parses a DSL for defining finite state machines, and produces code implementing the
14
- /// [StateMachine](trait.StateMachine.html) trait.
15
- ///
16
- /// An example state machine definition of a card reader for unlocking a door:
17
- /// ```
18
- /// # extern crate rustfsm_trait as rustfsm;
19
- /// use rustfsm_procmacro::fsm;
20
- /// use std::convert::Infallible;
21
- /// use rustfsm_trait::{StateMachine, TransitionResult};
22
- ///
23
- /// fsm! {
24
- /// name CardReader; command Commands; error Infallible; shared_state SharedState;
25
- ///
26
- /// Locked --(CardReadable(CardData), shared on_card_readable) --> ReadingCard;
27
- /// Locked --(CardReadable(CardData), shared on_card_readable) --> Locked;
28
- /// ReadingCard --(CardAccepted, on_card_accepted) --> DoorOpen;
29
- /// ReadingCard --(CardRejected, on_card_rejected) --> Locked;
30
- /// DoorOpen --(DoorClosed, on_door_closed) --> Locked;
31
- /// }
32
- ///
33
- /// #[derive(Clone)]
34
- /// pub struct SharedState {
35
- /// last_id: Option<String>
36
- /// }
37
- ///
38
- /// #[derive(Debug, Clone, Eq, PartialEq, Hash)]
39
- /// pub enum Commands {
40
- /// StartBlinkingLight,
41
- /// StopBlinkingLight,
42
- /// ProcessData(CardData),
43
- /// }
44
- ///
45
- /// type CardData = String;
46
- ///
47
- /// /// Door is locked / idle / we are ready to read
48
- /// #[derive(Debug, Clone, Eq, PartialEq, Hash, Default)]
49
- /// pub struct Locked {}
50
- ///
51
- /// /// Actively reading the card
52
- /// #[derive(Debug, Clone, Eq, PartialEq, Hash)]
53
- /// pub struct ReadingCard {
54
- /// card_data: CardData,
55
- /// }
56
- ///
57
- /// /// The door is open, we shouldn't be accepting cards and should be blinking the light
58
- /// #[derive(Debug, Clone, Eq, PartialEq, Hash)]
59
- /// pub struct DoorOpen {}
60
- /// impl DoorOpen {
61
- /// fn on_door_closed(&self) -> CardReaderTransition<Locked> {
62
- /// TransitionResult::ok(vec![], Locked {})
63
- /// }
64
- /// }
65
- ///
66
- /// impl Locked {
67
- /// fn on_card_readable(&self, shared_dat: SharedState, data: CardData)
68
- /// -> CardReaderTransition<ReadingCardOrLocked> {
69
- /// match shared_dat.last_id {
70
- /// // Arbitrarily deny the same person entering twice in a row
71
- /// Some(d) if d == data => TransitionResult::ok(vec![], Locked {}.into()),
72
- /// _ => {
73
- /// // Otherwise issue a processing command. This illustrates using the same handler
74
- /// // for different destinations
75
- /// TransitionResult::ok_shared(
76
- /// vec![
77
- /// Commands::ProcessData(data.clone()),
78
- /// Commands::StartBlinkingLight,
79
- /// ],
80
- /// ReadingCard { card_data: data.clone() }.into(),
81
- /// SharedState { last_id: Some(data) }
82
- /// )
83
- /// }
84
- /// }
85
- /// }
86
- /// }
87
- ///
88
- /// impl ReadingCard {
89
- /// fn on_card_accepted(&self) -> CardReaderTransition<DoorOpen> {
90
- /// TransitionResult::ok(vec![Commands::StopBlinkingLight], DoorOpen {})
91
- /// }
92
- /// fn on_card_rejected(&self) -> CardReaderTransition<Locked> {
93
- /// TransitionResult::ok(vec![Commands::StopBlinkingLight], Locked {})
94
- /// }
95
- /// }
96
- ///
97
- /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
98
- /// let crs = CardReaderState::Locked(Locked {});
99
- /// let mut cr = CardReader { state: crs, shared_state: SharedState { last_id: None } };
100
- /// let cmds = cr.on_event_mut(CardReaderEvents::CardReadable("badguy".to_string()))?;
101
- /// assert_eq!(cmds[0], Commands::ProcessData("badguy".to_string()));
102
- /// assert_eq!(cmds[1], Commands::StartBlinkingLight);
103
- ///
104
- /// let cmds = cr.on_event_mut(CardReaderEvents::CardRejected)?;
105
- /// assert_eq!(cmds[0], Commands::StopBlinkingLight);
106
- ///
107
- /// let cmds = cr.on_event_mut(CardReaderEvents::CardReadable("goodguy".to_string()))?;
108
- /// assert_eq!(cmds[0], Commands::ProcessData("goodguy".to_string()));
109
- /// assert_eq!(cmds[1], Commands::StartBlinkingLight);
110
- ///
111
- /// let cmds = cr.on_event_mut(CardReaderEvents::CardAccepted)?;
112
- /// assert_eq!(cmds[0], Commands::StopBlinkingLight);
113
- /// # Ok(())
114
- /// # }
115
- /// ```
116
- ///
117
- /// In the above example the first word is the name of the state machine, then after the comma the
118
- /// type (which you must define separately) of commands produced by the machine.
119
- ///
120
- /// then each line represents a transition, where the first word is the initial state, the tuple
121
- /// inside the arrow is `(eventtype[, event handler])`, and the word after the arrow is the
122
- /// destination state. here `eventtype` is an enum variant , and `event_handler` is a function you
123
- /// must define outside the enum whose form depends on the event variant. the only variant types
124
- /// allowed are unit and one-item tuple variants. For unit variants, the function takes no
125
- /// parameters. For the tuple variants, the function takes the variant data as its parameter. In
126
- /// either case the function is expected to return a `TransitionResult` to the appropriate state.
127
- ///
128
- /// The first transition can be interpreted as "If the machine is in the locked state, when a
129
- /// `CardReadable` event is seen, call `on_card_readable` (passing in `CardData`) and transition to
130
- /// the `ReadingCard` state.
131
- ///
132
- /// The macro will generate a few things:
133
- /// * A struct for the overall state machine, named with the provided name. Here:
134
- /// ```text
135
- /// struct CardReader {
136
- /// state: CardReaderState,
137
- /// shared_state: SharedState,
138
- /// }
139
- /// ```
140
- /// * An enum with a variant for each state, named with the provided name + "State".
141
- /// ```text
142
- /// enum CardReaderState {
143
- /// Locked(Locked),
144
- /// ReadingCard(ReadingCard),
145
- /// DoorOpen(DoorOpen),
146
- /// }
147
- /// ```
148
- ///
149
- /// You are expected to define a type for each state, to contain that state's data. If there is
150
- /// no data, you can simply: `type StateName = ()`
151
- /// * For any instance of transitions with the same event/handler which transition to different
152
- /// destination states (dynamic destinations), an enum named like `DestAOrDestBOrDestC` is
153
- /// generated. This enum must be used as the destination "state" from those handlers.
154
- /// * An enum with a variant for each event. You are expected to define the type (if any) contained
155
- /// in the event variant.
156
- /// ```text
157
- /// enum CardReaderEvents {
158
- /// DoorClosed,
159
- /// CardAccepted,
160
- /// CardRejected,
161
- /// CardReadable(CardData),
162
- /// }
163
- /// ```
164
- /// * An implementation of the [StateMachine](trait.StateMachine.html) trait for the generated state
165
- /// machine enum (in this case, `CardReader`)
166
- /// * A type alias for a [TransitionResult](enum.TransitionResult.html) with the appropriate generic
167
- /// parameters set for your machine. It is named as your machine with `Transition` appended. In
168
- /// this case, `CardReaderTransition`.
169
- #[proc_macro]
170
- pub fn fsm(input: TokenStream) -> TokenStream {
171
- let def: StateMachineDefinition = parse_macro_input!(input as StateMachineDefinition);
172
- def.codegen()
173
- }
174
-
175
- mod kw {
176
- syn::custom_keyword!(name);
177
- syn::custom_keyword!(command);
178
- syn::custom_keyword!(error);
179
- syn::custom_keyword!(shared);
180
- syn::custom_keyword!(shared_state);
181
- }
182
-
183
- struct StateMachineDefinition {
184
- visibility: Visibility,
185
- name: Ident,
186
- shared_state_type: Option<Type>,
187
- command_type: Ident,
188
- error_type: Ident,
189
- transitions: Vec<Transition>,
190
- }
191
-
192
- impl StateMachineDefinition {
193
- fn is_final_state(&self, state: &Ident) -> bool {
194
- // If no transitions go from this state, it's a final state.
195
- !self.transitions.iter().any(|t| t.from == *state)
196
- }
197
- }
198
-
199
- impl Parse for StateMachineDefinition {
200
- fn parse(input: ParseStream) -> Result<Self> {
201
- // Parse visibility if present
202
- let visibility = input.parse()?;
203
- // parse the state machine name, command type, and error type
204
- let (name, command_type, error_type, shared_state_type) = parse_machine_types(input)
205
- .map_err(|mut e| {
206
- e.combine(Error::new(
207
- e.span(),
208
- "The fsm definition should begin with `name MachineName; command CommandType; \
209
- error ErrorType;` optionally followed by `shared_state SharedStateType;`",
210
- ));
211
- e
212
- })?;
213
- // Then the state machine definition is simply a sequence of transitions separated by
214
- // semicolons
215
- let transitions: Punctuated<Transition, Token![;]> =
216
- input.parse_terminated(Transition::parse)?;
217
- let transitions: Vec<_> = transitions.into_iter().collect();
218
- // Check for and whine about any identical transitions. We do this here because preserving
219
- // the order transitions were defined in is important, so simply collecting to a set is
220
- // not ideal.
221
- let trans_set: HashSet<_> = transitions.iter().collect();
222
- if trans_set.len() != transitions.len() {
223
- return Err(syn::Error::new(
224
- input.span(),
225
- "Duplicate transitions are not allowed!",
226
- ));
227
- }
228
- Ok(Self {
229
- visibility,
230
- name,
231
- shared_state_type,
232
- command_type,
233
- error_type,
234
- transitions,
235
- })
236
- }
237
- }
238
-
239
- fn parse_machine_types(input: ParseStream) -> Result<(Ident, Ident, Ident, Option<Type>)> {
240
- let _: kw::name = input.parse()?;
241
- let name: Ident = input.parse()?;
242
- input.parse::<Token![;]>()?;
243
-
244
- let _: kw::command = input.parse()?;
245
- let command_type: Ident = input.parse()?;
246
- input.parse::<Token![;]>()?;
247
-
248
- let _: kw::error = input.parse()?;
249
- let error_type: Ident = input.parse()?;
250
- input.parse::<Token![;]>()?;
251
-
252
- let shared_state_type: Option<Type> = if input.peek(kw::shared_state) {
253
- let _: kw::shared_state = input.parse()?;
254
- let typep = input.parse()?;
255
- input.parse::<Token![;]>()?;
256
- Some(typep)
257
- } else {
258
- None
259
- };
260
- Ok((name, command_type, error_type, shared_state_type))
261
- }
262
-
263
- #[derive(Debug, Clone, Eq, PartialEq, Hash)]
264
- struct Transition {
265
- from: Ident,
266
- to: Vec<Ident>,
267
- event: Variant,
268
- handler: Option<Ident>,
269
- mutates_shared: bool,
270
- }
271
-
272
- impl Parse for Transition {
273
- fn parse(input: ParseStream) -> Result<Self> {
274
- // Parse the initial state name
275
- let from: Ident = input.parse()?;
276
- // Parse at least one dash
277
- input.parse::<Token![-]>()?;
278
- while input.peek(Token![-]) {
279
- input.parse::<Token![-]>()?;
280
- }
281
- // Parse transition information inside parens
282
- let transition_info;
283
- parenthesized!(transition_info in input);
284
- // Get the event variant definition
285
- let event: Variant = transition_info.parse()?;
286
- // Reject non-unit or single-item-tuple variants
287
- match &event.fields {
288
- Fields::Named(_) => {
289
- return Err(Error::new(
290
- event.span(),
291
- "Struct variants are not supported for events",
292
- ))
293
- }
294
- Fields::Unnamed(uf) => {
295
- if uf.unnamed.len() != 1 {
296
- return Err(Error::new(
297
- event.span(),
298
- "Only tuple variants with exactly one item are supported for events",
299
- ));
300
- }
301
- }
302
- Fields::Unit => {}
303
- }
304
- // Check if there is an event handler, and parse it
305
- let (mutates_shared, handler) = if transition_info.peek(Token![,]) {
306
- transition_info.parse::<Token![,]>()?;
307
- // Check for mut keyword signifying handler wants to mutate shared state
308
- let mutates = if transition_info.peek(kw::shared) {
309
- transition_info.parse::<kw::shared>()?;
310
- true
311
- } else {
312
- false
313
- };
314
- (mutates, Some(transition_info.parse()?))
315
- } else {
316
- (false, None)
317
- };
318
- // Parse at least one dash followed by the "arrow"
319
- input.parse::<Token![-]>()?;
320
- while input.peek(Token![-]) {
321
- input.parse::<Token![-]>()?;
322
- }
323
- input.parse::<Token![>]>()?;
324
- // Parse the destination state
325
- let to: Ident = input.parse()?;
326
-
327
- Ok(Self {
328
- from,
329
- event,
330
- handler,
331
- to: vec![to],
332
- mutates_shared,
333
- })
334
- }
335
- }
336
-
337
- impl StateMachineDefinition {
338
- fn codegen(&self) -> TokenStream {
339
- let visibility = self.visibility.clone();
340
- // First extract all of the states into a set, and build the enum's insides
341
- let states = self.all_states();
342
- let state_variants = states.iter().map(|s| {
343
- let statestr = s.to_string();
344
- quote! {
345
- #[display(fmt=#statestr)]
346
- #s(#s)
347
- }
348
- });
349
- let name = &self.name;
350
- let name_str = &self.name.to_string();
351
-
352
- let transition_result_name = Ident::new(&format!("{name}Transition"), name.span());
353
- let transition_type_alias = quote! {
354
- type #transition_result_name<Ds, Sm = #name> = TransitionResult<Sm, Ds>;
355
- };
356
-
357
- let state_enum_name = Ident::new(&format!("{name}State"), name.span());
358
- // If user has not defined any shared state, use the unit type.
359
- let shared_state_type = self
360
- .shared_state_type
361
- .clone()
362
- .unwrap_or_else(|| syn::parse_str("()").unwrap());
363
- let machine_struct = quote! {
364
- #[derive(Clone)]
365
- #visibility struct #name {
366
- state: #state_enum_name,
367
- shared_state: #shared_state_type
368
- }
369
- };
370
- let states_enum = quote! {
371
- #[derive(::derive_more::From, Clone, ::derive_more::Display)]
372
- #visibility enum #state_enum_name {
373
- #(#state_variants),*
374
- }
375
- };
376
- let state_is_final_match_arms = states.iter().map(|s| {
377
- let val = if self.is_final_state(s) {
378
- quote! { true }
379
- } else {
380
- quote! { false }
381
- };
382
- quote! { #state_enum_name::#s(_) => #val }
383
- });
384
- let states_enum_impl = quote! {
385
- impl #state_enum_name {
386
- fn is_final(&self) -> bool {
387
- match self {
388
- #(#state_is_final_match_arms),*
389
- }
390
- }
391
- }
392
- };
393
-
394
- // Build the events enum
395
- let events: HashSet<Variant> = self.transitions.iter().map(|t| t.event.clone()).collect();
396
- let events_enum_name = Ident::new(&format!("{name}Events"), name.span());
397
- let events: Vec<_> = events
398
- .into_iter()
399
- .map(|v| {
400
- let vname = v.ident.to_string();
401
- quote! {
402
- #[display(fmt=#vname)]
403
- #v
404
- }
405
- })
406
- .collect();
407
- let events_enum = quote! {
408
- #[derive(::derive_more::Display)]
409
- #visibility enum #events_enum_name {
410
- #(#events),*
411
- }
412
- };
413
-
414
- // Construct the trait implementation
415
- let cmd_type = &self.command_type;
416
- let err_type = &self.error_type;
417
- let mut statemap: HashMap<Ident, Vec<Transition>> = HashMap::new();
418
- for t in &self.transitions {
419
- statemap
420
- .entry(t.from.clone())
421
- .and_modify(|v| v.push(t.clone()))
422
- .or_insert_with(|| vec![t.clone()]);
423
- }
424
- // Add any states without any transitions to the map
425
- for s in &states {
426
- if !statemap.contains_key(s) {
427
- statemap.insert(s.clone(), vec![]);
428
- }
429
- }
430
- let mut multi_dest_enums = vec![];
431
- let state_branches: Vec<_> = statemap.into_iter().map(|(from, transitions)| {
432
- // Merge transition dest states with the same handler
433
- let transitions = merge_transition_dests(transitions);
434
- let event_branches = transitions
435
- .into_iter()
436
- .map(|ts| {
437
- let ev_variant = &ts.event.ident;
438
- if let Some(ts_fn) = ts.handler.clone() {
439
- let span = ts_fn.span();
440
- let trans_type = match ts.to.as_slice() {
441
- [] => unreachable!("There will be at least one dest state in transitions"),
442
- [one_to] => quote! {
443
- #transition_result_name<#one_to>
444
- },
445
- multi_dests => {
446
- let string_dests: Vec<_> = multi_dests.iter()
447
- .map(ToString::to_string).collect();
448
- let enum_ident = Ident::new(&string_dests.join("Or"),
449
- multi_dests[0].span());
450
- let multi_dest_enum = quote! {
451
- #[derive(::derive_more::From)]
452
- #visibility enum #enum_ident {
453
- #(#multi_dests(#multi_dests)),*
454
- }
455
- impl ::core::convert::From<#enum_ident> for #state_enum_name {
456
- fn from(v: #enum_ident) -> Self {
457
- match v {
458
- #( #enum_ident::#multi_dests(sv) =>
459
- Self::#multi_dests(sv) ),*
460
- }
461
- }
462
- }
463
- };
464
- multi_dest_enums.push(multi_dest_enum);
465
- quote! {
466
- #transition_result_name<#enum_ident>
467
- }
468
- }
469
- };
470
- match ts.event.fields {
471
- Fields::Unnamed(_) => {
472
- let arglist = if ts.mutates_shared {
473
- quote! {self.shared_state, val}
474
- } else {
475
- quote! {val}
476
- };
477
- quote_spanned! {span=>
478
- #events_enum_name::#ev_variant(val) => {
479
- let res: #trans_type = state_data.#ts_fn(#arglist);
480
- res.into_general()
481
- }
482
- }
483
- }
484
- Fields::Unit => {
485
- let arglist = if ts.mutates_shared {
486
- quote! {self.shared_state}
487
- } else {
488
- quote! {}
489
- };
490
- quote_spanned! {span=>
491
- #events_enum_name::#ev_variant => {
492
- let res: #trans_type = state_data.#ts_fn(#arglist);
493
- res.into_general()
494
- }
495
- }
496
- }
497
- Fields::Named(_) => unreachable!(),
498
- }
499
- } else {
500
- // If events do not have a handler, attempt to construct the next state
501
- // using `Default`.
502
- if let [new_state] = ts.to.as_slice() {
503
- let span = new_state.span();
504
- let default_trans = quote_spanned! {span=>
505
- TransitionResult::<_, #new_state>::from::<#from>(state_data).into_general()
506
- };
507
- let span = ts.event.span();
508
- match ts.event.fields {
509
- Fields::Unnamed(_) => quote_spanned! {span=>
510
- #events_enum_name::#ev_variant(_val) => {
511
- #default_trans
512
- }
513
- },
514
- Fields::Unit => quote_spanned! {span=>
515
- #events_enum_name::#ev_variant => {
516
- #default_trans
517
- }
518
- },
519
- Fields::Named(_) => unreachable!(),
520
- }
521
-
522
- } else {
523
- unreachable!("It should be impossible to have more than one dest state in no-handler transitions")
524
- }
525
- }
526
- })
527
- // Since most states won't handle every possible event, return an error to that effect
528
- .chain(std::iter::once(
529
- quote! { _ => { return TransitionResult::InvalidTransition } },
530
- ));
531
- quote! {
532
- #state_enum_name::#from(state_data) => match event {
533
- #(#event_branches),*
534
- }
535
- }
536
- }).collect();
537
-
538
- let viz_str = self.visualize();
539
-
540
- let trait_impl = quote! {
541
- impl ::rustfsm::StateMachine for #name {
542
- type Error = #err_type;
543
- type State = #state_enum_name;
544
- type SharedState = #shared_state_type;
545
- type Event = #events_enum_name;
546
- type Command = #cmd_type;
547
-
548
- fn name(&self) -> &str {
549
- #name_str
550
- }
551
-
552
- fn on_event(self, event: #events_enum_name)
553
- -> ::rustfsm::TransitionResult<Self, Self::State> {
554
- match self.state {
555
- #(#state_branches),*
556
- }
557
- }
558
-
559
- fn state(&self) -> &Self::State {
560
- &self.state
561
- }
562
-
563
- fn set_state(&mut self, new: Self::State) {
564
- self.state = new
565
- }
566
-
567
- fn shared_state(&self) -> &Self::SharedState{
568
- &self.shared_state
569
- }
570
-
571
- fn has_reached_final_state(&self) -> bool {
572
- self.state.is_final()
573
- }
574
-
575
- fn from_parts(shared: Self::SharedState, state: Self::State) -> Self {
576
- Self { shared_state: shared, state }
577
- }
578
-
579
- fn visualizer() -> &'static str {
580
- #viz_str
581
- }
582
- }
583
- };
584
-
585
- let output = quote! {
586
- #transition_type_alias
587
- #machine_struct
588
- #states_enum
589
- #(#multi_dest_enums)*
590
- #states_enum_impl
591
- #events_enum
592
- #trait_impl
593
- };
594
-
595
- TokenStream::from(output)
596
- }
597
-
598
- fn all_states(&self) -> HashSet<Ident> {
599
- self.transitions
600
- .iter()
601
- .flat_map(|t| {
602
- let mut states = t.to.clone();
603
- states.push(t.from.clone());
604
- states
605
- })
606
- .collect()
607
- }
608
-
609
- fn visualize(&self) -> String {
610
- let transitions: Vec<String> = self
611
- .transitions
612
- .iter()
613
- .flat_map(|t| {
614
- t.to.iter()
615
- .map(move |d| format!("{} --> {}: {}", t.from, d, t.event.ident))
616
- })
617
- // Add all final state transitions
618
- .chain(
619
- self.all_states()
620
- .iter()
621
- .filter(|s| self.is_final_state(s))
622
- .map(|s| format!("{s} --> [*]")),
623
- )
624
- .collect();
625
- let transitions = transitions.join("\n");
626
- format!("@startuml\n{transitions}\n@enduml")
627
- }
628
- }
629
-
630
- /// Merge transition's dest state lists for those with the same from state & handler
631
- fn merge_transition_dests(transitions: Vec<Transition>) -> Vec<Transition> {
632
- let mut map = HashMap::<_, Transition>::new();
633
- for t in transitions {
634
- // We want to use the transition sans-destinations as the key
635
- let without_dests = {
636
- let mut wd = t.clone();
637
- wd.to = vec![];
638
- wd
639
- };
640
- match map.entry(without_dests) {
641
- Entry::Occupied(mut e) => {
642
- e.get_mut().to.extend(t.to.into_iter());
643
- }
644
- Entry::Vacant(v) => {
645
- v.insert(t);
646
- }
647
- }
648
- }
649
- map.into_values().collect()
650
- }
@@ -1,8 +0,0 @@
1
- extern crate rustfsm_trait as rustfsm;
2
-
3
- #[test]
4
- fn tests() {
5
- let t = trybuild::TestCases::new();
6
- t.pass("tests/trybuild/*_pass.rs");
7
- t.compile_fail("tests/trybuild/*_fail.rs");
8
- }
@@ -1,18 +0,0 @@
1
- extern crate rustfsm_trait as rustfsm;
2
-
3
- use rustfsm_procmacro::fsm;
4
-
5
- fsm! {
6
- name SimpleMachine; command SimpleMachineCommand; error Infallible;
7
-
8
- One --(A)--> Two;
9
- One --(A)--> Two;
10
- }
11
-
12
- #[derive(Default, Clone)]
13
- pub struct One {}
14
-
15
- #[derive(Default, Clone)]
16
- pub struct Two {}
17
-
18
- fn main() {}
@@ -1,12 +0,0 @@
1
- error: Duplicate transitions are not allowed!
2
- --> $DIR/dupe_transitions_fail.rs:5:1
3
- |
4
- 5 | / fsm! {
5
- 6 | | name SimpleMachine; command SimpleMachineCommand; error Infallible;
6
- 7 | |
7
- 8 | | One --(A)--> Two;
8
- 9 | | One --(A)--> Two;
9
- 10 | | }
10
- | |_^
11
- |
12
- = note: this error originates in the macro `fsm` (in Nightly builds, run with -Z macro-backtrace for more info)