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