Skip to content

Instantly share code, notes, and snippets.

@tsommer
Created January 15, 2010 00:36
Show Gist options
  • Save tsommer/277659 to your computer and use it in GitHub Desktop.
Save tsommer/277659 to your computer and use it in GitHub Desktop.
grammar Promo
rule root
empty rules:(trigger_or_effect empty)* {
def triggers
rules.elements.select { |r| r.elements.first.respond_to?(:trigger) }.map { |r| r.elements.first.trigger }
rescue NameError # nil for some object
[]
end
def effect
rules.elements.find { |r| r.elements.first.respond_to?(:effect) }.elements.first.effect
rescue NameError # nil for some object
nil
end
}
end
rule trigger_or_effect
"spend $" amount_in_cents " on product group " name {
def trigger
PromotionTrigger.new(:test_type => "MinimumValueSpendOnProductGroup",
:test_data => { :value_in_cents => amount_in_cents.value, :group => name.text_value })
end
}
/
"spend $" amount_in_cents {
def trigger
PromotionTrigger.new(:test_type => "MinimumShoppingCartValue",
:test_data => amount_in_cents.value)
end
}
/
"and get $" amount_in_cents " off" {
def effect
PromotionEffect.new(:effect_type => "AddDiscount",
:effect_data => amount_in_cents.value)
end
}
/
"and get free shipping" {
def effect
PromotionEffect.new(:effect_type => "SetFreightCost",
:effect_data => 1199)
end
}
end
rule amount_in_cents
[0-9]+ ("\." [0-9]+)? {
def value
(text_value.to_f * 100).round
end
}
end
rule name
[a-zA-Z0-9 -_]+
end
rule empty
[\n\t\r]*
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment