lib/X12/Parser.rb in X12-0.0.5 vs lib/X12/Parser.rb in X12-0.1.0

- old
+ new

@@ -21,29 +21,32 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #++ # module X12 - # $Id: Parser.rb 35 2008-11-13 18:33:44Z ikk $ + # $Id: Parser.rb 54 2009-03-18 17:04:45Z ikk $ # # Main class for creating X12 parsers and factories. class Parser # Creates a parser out of a definition def initialize(file_name) + save_definition = @x12_definition + #puts "Reading definition from #{file_name}" str = File.open(file_name, 'r').read + @dir_name = File.dirname(file_name) # to look up other files if needed treetop_parser = X12::X12syntaxParser.new res = treetop_parser.parse(str) throw Exception.new("Cannot parse X12 definition in #{file_name}") unless res @x12_definition = res.get # Populate fields in all segments found in all the loops @x12_definition[X12::Loop].each_pair{|k, v| #puts "Processing loop #{k}" process_loop(v) - } + } if @x12_definition[X12::Loop] # @x12_definition.keys.each{|t| # puts "**** #{t}" # case # when t==X12::Segment: @x12_definition[t].each{|i| puts i.inspect; puts i.regexp.source} @@ -52,10 +55,19 @@ # puts @x12_definition[t].inspect # end # puts "\n\n" # } + # Merge the saved definition, if any, into the newly parsed one + return unless save_definition + save_definition.keys.each{|t| + @x12_definition[t] ||= {} + save_definition[t].keys.each{|u| + @x12_definition[t][u] = save_definition[t][u] + } + } + end # Parse a loop of a given name out of a string. Throws an exception if the loop name is not defined. def parse(loop_name, str) loop = @x12_definition[X12::Loop][loop_name] @@ -77,21 +89,35 @@ # segments def process_loop(loop) loop.nodes.each{|i| case i when X12::Loop: process_loop(i) - when X12::Segment: process_segment(i) + when X12::Segment: process_segment(i) unless i.nodes.size > 0 else return end } end # Instantiate segment's fields as previously defined def process_segment(segment) - segment_definition = @x12_definition[X12::Segment][segment.name] - return unless segment_definition + unless @x12_definition[X12::Segment] && @x12_definition[X12::Segment][segment.name] + # Try to find it in a separate file if missing from the @x12_definition structure + initialize(File.join(@dir_name, segment.name+'.d12')) + segment_definition = @x12_definition[X12::Segment][segment.name] + throw Exception.new("Cannot find a definition for segment #{segment.name}") unless segment_definition + else + segment_definition = @x12_definition[X12::Segment][segment.name] + end segment_definition.nodes.each_index{|i| segment.nodes[i] = segment_definition.nodes[i] + # Make sure we have the validation table if any for this field. Try to read one in if missing. + table = segment.nodes[i].validation + if table + unless @x12_definition[X12::Table] && @x12_definition[X12::Table][table] + initialize(File.join(@dir_name, table+'.d12')) + throw Exception.new("Cannot find a definition for table #{table}") unless @x12_definition[X12::Table] && @x12_definition[X12::Table][table] + end + end } end end # Parser end