LoginSignup
0
0

More than 5 years have passed since last update.

DSL Study in ruby3

Posted at

If there are 2 cases like sales in America and Japan.
How should we implement it?

events.rb
@a_target_sale = 0
@j_target_sale = 0
@a_sale = 0
@j_sale = 0

set_target_sales "set target_sales in America" do
  @a_target_sale = 50
end

set_target_sales "set target_sales in Japan" do
  @j_target_sale = 50
end

select_sales "select_sales in America" do
  @a_sale = 50
end

select_sales "select_sales in Japan" do
  @j_sale = 200
end

event "sales is enough in America" do
  @a_target_sale < @a_sale
end

event "sales is enough in Japan" do
  @j_target_sale < @j_sale
end

event "sales is soso in America" do
  @a_target_sale == @a_sale
end

event "sales is soso in Japan" do
  @j_target_sale == @j_sale
end

event "sales is not enough in America" do
  @a_target_sale > @a_sale
end

event "sales is not enough in Japan" do
  @j_target_sale > @j_sale
end
setup.rb
def event(description, &block)
  @events << {:description => description, :condition => block}
end

def select_sales(description, &block)
  @setups << {:description => description, :condition => block}
end

def set_target_sales(description, &block)
  @target_sales << {:description => description, :condition => block}
end
act.rb
@events = []
@setups = []
@target_sales = []
load 'setup.rb'
load 'events.rb'

@events.each do |event|
  puts "----------START event: #{event[:description]}----------"
  @target_sales.each do |target_sale|
    puts "START target_sale: #{target_sale[:description]}"
    target_sale[:condition].call
  end
  @setups.each do |setup|
    puts "#{setup[:description]}"
    setup[:condition].call
  end
  puts "ALERT: #{event[:description]}" if event[:condition].call
end

ruby act.rb

Here are result.

----------START event: sales is enough in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is enough in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
ALERT: sales is enough in Japan
----------START event: sales is soso in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
ALERT: sales is soso in America
----------START event: sales is soso in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is not enough in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is not enough in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0