Class: RaceGuard::Rule::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/race_guard/rule.rb

Overview

DSL used inside define_rule blocks.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ Builder

Returns a new instance of Builder.



35
36
37
38
39
40
41
42
# File 'lib/race_guard/rule.rb', line 35

def initialize(name)
  @name = name.to_sym
  @detect = nil
  @message = nil
  @hooks = {}
  @run_on = Set.new
  @severity = nil
end

Class Method Details

.validate_event!(event) ⇒ Object

Raises:

  • (ArgumentError)


80
81
82
83
84
85
86
# File 'lib/race_guard/rule.rb', line 80

def self.validate_event!(event)
  sym = event.to_sym
  return sym if Rule::KNOWN_EVENTS.include?(sym)

  list = Rule::KNOWN_EVENTS.join(', ')
  raise ArgumentError, "unknown rule event #{event.inspect} (expected one of: #{list})"
end

Instance Method Details

#buildObject

Raises:

  • (ArgumentError)


65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/race_guard/rule.rb', line 65

def build
  raise ArgumentError, "rule #{@name.inspect} requires detect { ... }" unless @detect
  raise ArgumentError, "rule #{@name.inspect} requires message { ... }" unless @message

  hooks_frozen = @hooks.transform_values { |list| list.dup.freeze }.freeze
  Rule.new(
    name: @name,
    detect_proc: @detect,
    message_proc: @message,
    hooks: hooks_frozen.freeze,
    run_on: @run_on.dup.freeze,
    severity_override: @severity
  )
end

#detect(&block) ⇒ Object



44
45
46
# File 'lib/race_guard/rule.rb', line 44

def detect(&block)
  @detect = block
end

#hook(event, &block) ⇒ Object



52
53
54
55
# File 'lib/race_guard/rule.rb', line 52

def hook(event, &block)
  sym = self.class.validate_event!(event)
  (@hooks[sym] ||= []) << block
end

#message(&block) ⇒ Object



48
49
50
# File 'lib/race_guard/rule.rb', line 48

def message(&block)
  @message = block
end

#run_on(*events) ⇒ Object



57
58
59
# File 'lib/race_guard/rule.rb', line 57

def run_on(*events)
  events.flatten.compact.each { |e| @run_on.add(self.class.validate_event!(e)) }
end

#severity(level) ⇒ Object



61
62
63
# File 'lib/race_guard/rule.rb', line 61

def severity(level)
  @severity = level&.to_sym
end