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