/src/Automatonymous/Builders/InternalStateMachineModifier.cs

https://github.com/MassTransit/Automatonymous · C# · 243 lines · 205 code · 37 blank · 1 comment · 0 complexity · 7f1de650afd0068e8b2f2d7c17f67b09 MD5 · raw file

  1. namespace Automatonymous.Builder
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Linq.Expressions;
  7. using Binders;
  8. class InternalStateMachineModifier<TInstance> : StateMachineModifier<TInstance>
  9. where TInstance : class
  10. {
  11. readonly List<StateMachineEventActivitiesBuilder<TInstance>> _activityBuilders;
  12. readonly AutomatonymousStateMachine<TInstance> _machine;
  13. public InternalStateMachineModifier(AutomatonymousStateMachine<TInstance> machine)
  14. {
  15. _machine = machine ?? throw new ArgumentNullException(nameof(machine));
  16. _activityBuilders = new List<StateMachineEventActivitiesBuilder<TInstance>>();
  17. }
  18. public State Initial => _machine.Initial;
  19. public State Final => _machine.Final;
  20. public void Apply()
  21. {
  22. var uncommittedActivities = _activityBuilders
  23. .Where(builder => !builder.IsCommitted)
  24. .ToArray();
  25. foreach (var builder in uncommittedActivities)
  26. builder.CommitActivities();
  27. }
  28. public StateMachineEventActivitiesBuilder<TInstance> During(params State[] states)
  29. {
  30. var builder = new InternalStateMachineEventActivitiesBuilder<TInstance>(_machine, this,
  31. activities => _machine.During(states, activities));
  32. _activityBuilders.Add(builder);
  33. return builder;
  34. }
  35. public StateMachineEventActivitiesBuilder<TInstance> DuringAny()
  36. {
  37. var builder = new InternalStateMachineEventActivitiesBuilder<TInstance>(_machine, this,
  38. activities => _machine.DuringAny(activities));
  39. _activityBuilders.Add(builder);
  40. return builder;
  41. }
  42. public StateMachineEventActivitiesBuilder<TInstance> Initially()
  43. {
  44. var builder = new InternalStateMachineEventActivitiesBuilder<TInstance>(_machine, this,
  45. activities => _machine.Initially(activities));
  46. _activityBuilders.Add(builder);
  47. return builder;
  48. }
  49. public StateMachineModifier<TInstance> AfterLeave(State state,
  50. Func<EventActivityBinder<TInstance, State>, EventActivityBinder<TInstance, State>> activityCallback)
  51. {
  52. _machine.AfterLeave(state, activityCallback);
  53. return this;
  54. }
  55. public StateMachineModifier<TInstance> AfterLeaveAny(
  56. Func<EventActivityBinder<TInstance, State>, EventActivityBinder<TInstance, State>> activityCallback)
  57. {
  58. _machine.AfterLeaveAny(activityCallback);
  59. return this;
  60. }
  61. public StateMachineModifier<TInstance> BeforeEnter(State state,
  62. Func<EventActivityBinder<TInstance, State>, EventActivityBinder<TInstance, State>> activityCallback)
  63. {
  64. _machine.BeforeEnter(state, activityCallback);
  65. return this;
  66. }
  67. public StateMachineModifier<TInstance> BeforeEnterAny(
  68. Func<EventActivityBinder<TInstance, State>, EventActivityBinder<TInstance, State>> activityCallback)
  69. {
  70. _machine.BeforeEnterAny(activityCallback);
  71. return this;
  72. }
  73. public StateMachineModifier<TInstance> CompositeEvent(Event @event,
  74. Expression<Func<TInstance, CompositeEventStatus>> trackingPropertyExpression, params Event[] events)
  75. {
  76. _machine.CompositeEvent(@event, trackingPropertyExpression, events);
  77. return this;
  78. }
  79. public StateMachineModifier<TInstance> CompositeEvent(Event @event,
  80. Expression<Func<TInstance, CompositeEventStatus>> trackingPropertyExpression, CompositeEventOptions options,
  81. params Event[] events)
  82. {
  83. _machine.CompositeEvent(@event, trackingPropertyExpression, options, events);
  84. return this;
  85. }
  86. public StateMachineModifier<TInstance> CompositeEvent(Event @event, Expression<Func<TInstance, int>> trackingPropertyExpression,
  87. params Event[] events)
  88. {
  89. _machine.CompositeEvent(@event, trackingPropertyExpression, events);
  90. return this;
  91. }
  92. public StateMachineModifier<TInstance> CompositeEvent(Event @event, Expression<Func<TInstance, int>> trackingPropertyExpression,
  93. CompositeEventOptions options, params Event[] events)
  94. {
  95. _machine.CompositeEvent(@event, trackingPropertyExpression, options, events);
  96. return this;
  97. }
  98. public StateMachineModifier<TInstance> Event(string name, out Event @event)
  99. {
  100. @event = _machine.Event(name);
  101. return this;
  102. }
  103. public StateMachineModifier<TInstance> Event<T>(string name, out Event<T> @event)
  104. {
  105. @event = _machine.Event<T>(name);
  106. return this;
  107. }
  108. public StateMachineModifier<TInstance> Event<TProperty, T>(Expression<Func<TProperty>> propertyExpression,
  109. Expression<Func<TProperty, Event<T>>> eventPropertyExpression) where TProperty : class
  110. {
  111. _machine.Event(propertyExpression, eventPropertyExpression);
  112. return this;
  113. }
  114. public StateMachineModifier<TInstance> Finally(Func<EventActivityBinder<TInstance>, EventActivityBinder<TInstance>> activityCallback)
  115. {
  116. _machine.Finally(activityCallback);
  117. return this;
  118. }
  119. public StateMachineModifier<TInstance> InstanceState(Expression<Func<TInstance, State>> instanceStateProperty)
  120. {
  121. _machine.InstanceState(instanceStateProperty);
  122. return this;
  123. }
  124. public StateMachineModifier<TInstance> InstanceState(Expression<Func<TInstance, string>> instanceStateProperty)
  125. {
  126. _machine.InstanceState(instanceStateProperty);
  127. return this;
  128. }
  129. public StateMachineModifier<TInstance> InstanceState(Expression<Func<TInstance, int>> instanceStateProperty, params State[] states)
  130. {
  131. _machine.InstanceState(instanceStateProperty, states);
  132. return this;
  133. }
  134. public StateMachineModifier<TInstance> Name(string machineName)
  135. {
  136. _machine.Name(machineName);
  137. return this;
  138. }
  139. public StateMachineModifier<TInstance> OnUnhandledEvent(UnhandledEventCallback<TInstance> callback)
  140. {
  141. _machine.OnUnhandledEvent(callback);
  142. return this;
  143. }
  144. public StateMachineModifier<TInstance> State(string name, out State<TInstance> state)
  145. {
  146. state = _machine.State(name);
  147. return this;
  148. }
  149. public StateMachineModifier<TInstance> State(string name, out State state)
  150. {
  151. state = _machine.State(name);
  152. return this;
  153. }
  154. public StateMachineModifier<TInstance> State<TProperty>(Expression<Func<TProperty>> propertyExpression,
  155. Expression<Func<TProperty, State>> statePropertyExpression) where TProperty : class
  156. {
  157. _machine.State(propertyExpression, statePropertyExpression);
  158. return this;
  159. }
  160. public StateMachineModifier<TInstance> SubState(string name, State superState, out State<TInstance> subState)
  161. {
  162. subState = _machine.SubState(name, superState);
  163. return this;
  164. }
  165. public StateMachineModifier<TInstance> SubState<TProperty>(Expression<Func<TProperty>> propertyExpression,
  166. Expression<Func<TProperty, State>> statePropertyExpression, State superState) where TProperty : class
  167. {
  168. _machine.SubState(propertyExpression, statePropertyExpression, superState);
  169. return this;
  170. }
  171. public StateMachineModifier<TInstance> WhenEnter(State state,
  172. Func<EventActivityBinder<TInstance>, EventActivityBinder<TInstance>> activityCallback)
  173. {
  174. _machine.WhenEnter(state, activityCallback);
  175. return this;
  176. }
  177. public StateMachineModifier<TInstance> WhenEnterAny(
  178. Func<EventActivityBinder<TInstance>, EventActivityBinder<TInstance>> activityCallback)
  179. {
  180. _machine.WhenEnterAny(activityCallback);
  181. return this;
  182. }
  183. public StateMachineModifier<TInstance> WhenLeave(State state,
  184. Func<EventActivityBinder<TInstance>, EventActivityBinder<TInstance>> activityCallback)
  185. {
  186. _machine.WhenLeave(state, activityCallback);
  187. return this;
  188. }
  189. public StateMachineModifier<TInstance> WhenLeaveAny(
  190. Func<EventActivityBinder<TInstance>, EventActivityBinder<TInstance>> activityCallback)
  191. {
  192. _machine.WhenLeaveAny(activityCallback);
  193. return this;
  194. }
  195. public StateMachineModifier<TInstance> InstanceState(Expression<Func<TInstance, int>> instanceStateProperty,
  196. params string[] stateNames)
  197. {
  198. // NOTE: May need to re-think this; Assumes the states have already been declared.
  199. State[] states = stateNames
  200. .Select(name => _machine.GetState(name))
  201. .ToArray();
  202. _machine.InstanceState(instanceStateProperty, states);
  203. return this;
  204. }
  205. }
  206. }