lib/flows/flow.rb in flows-0.4.0 vs lib/flows/flow.rb in flows-0.5.0
- old
+ new
@@ -1,5 +1,6 @@
+require_relative 'flow/errors'
require_relative 'flow/node'
require_relative 'flow/router'
module Flows
# Abstraction for build [deterministic finite-state machine](https://www.freecodecamp.org/news/state-machines-basics-of-computer-science-d42855debc66/)-like
@@ -64,13 +65,17 @@
# flow.call([1, 2, 3, 4, 5], context: {})
# # prints 'Big' and returns nil
class Flow
# @param start_node [Symbol] name of the entry node.
# @param node_map [Hash<Symbol, Node>] keys are node names, values are nodes.
+ # @raise [Flows::Flow::InvalidNodeRouteError] when some node has invalid routing destination.
+ # @raise [Flows::Flow::InvalidFirstNodeError] when first node is not presented in node map.
def initialize(start_node:, node_map:)
@start_node = start_node
@node_map = node_map
+
+ check_routing_integrity
end
# Executes a flow.
#
# @param input [Object] initial input
@@ -82,8 +87,24 @@
while current_node_name != :end
input, current_node_name = @node_map[current_node_name].call(input, context: context)
end
input
+ end
+
+ private
+
+ def check_routing_integrity
+ raise InvalidFirstNodeError, @start_node unless @node_map.key?(@start_node)
+
+ @node_map.each { |node_name, node| check_node_routing_integrity(node_name, node) }
+ end
+
+ def check_node_routing_integrity(node_name, node)
+ node.router.destinations.each do |destination_name|
+ if destination_name != :end && !@node_map.key?(destination_name)
+ raise InvalidNodeRouteError.new(node_name, destination_name)
+ end
+ end
end
end
end