class Glaemscribe::API::Rule

Attributes

dst_sheaf_chain[RW]
errors[R]
line[RW]
mode[R]
src_sheaf_chain[RW]
sub_rules[R]

Public Class Methods

new(line, rule_group) click to toggle source
# File lib/api/rule.rb, line 33
def initialize(line, rule_group)
  @line       = line
  @rule_group = rule_group
  @mode       = @rule_group.mode
  @sub_rules  = []
  @errors     = []
end

Public Instance Methods

finalize(cross_schema) click to toggle source
# File lib/api/rule.rb, line 41
def finalize(cross_schema)
  
  if(@errors.any?)
    @errors.each { |e|
      @mode.errors << Glaeml::Error.new(@line, e)
    }
    return         
  end
  
  srccounter  = SheafChainIterator.new(@src_sheaf_chain)
  dstcounter  = SheafChainIterator.new(@dst_sheaf_chain, cross_schema)
  
  if(srccounter.errors.any?)
    srccounter.errors.each{ |e| @mode.errors << Glaeml::Error.new(@line, e) }
    return
  end
  
  if(dstcounter.errors.any?)
    dstcounter.errors.each{ |e| @mode.errors << Glaeml::Error.new(@line, e) }
    return
  end     

  srcp = srccounter.prototype
  dstp = dstcounter.prototype
  
  if srcp != dstp
    @mode.errors << Glaeml::Error.new(@line, "Source and destination are not compatible (#{srcp} vs #{dstp})")
    return
  end
  
  begin 
   
    # All equivalent combinations ...
    src_combinations  = srccounter.combinations 
   
    # ... should be sent to one destination
    dst_combination   = dstcounter.combinations.first
 
    src_combinations.each{ |src_combination|
      @sub_rules << SubRule.new(self, src_combination, dst_combination)
    }

    dstcounter.iterate()
  end while srccounter.iterate()
  
end
p() click to toggle source
# File lib/api/rule.rb, line 88
def p
  ret = ("=" * 30) + "\n"
  @sub_rules.each{ |sr|
    ret += sr.p
  }
  ret
end