Class: Glimmer::DSL::ExpressionHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/glimmer/dsl/expression_handler.rb

Overview

Expression handler for a Glimmer DSL specific expression

Follows the Chain of Responsibility Design Pattern

Handlers are configured in Glimmer::DSL in the right order to attempt handling Glimmer DSL interpretation calls

Each handler knows the next handler in the chain of responsibility.

If it handles successfully, it returns. Otherwise, it forwards to the next handler in the chain of responsibility

Instance Method Summary collapse

Constructor Details

#initialize(expression) ⇒ ExpressionHandler

Returns a new instance of ExpressionHandler.



17
18
19
# File 'lib/glimmer/dsl/expression_handler.rb', line 17

def initialize(expression)
  @expression = expression
end

Instance Method Details

#handle(parent, keyword, *args, &block) ⇒ Object

Handles interpretation of Glimmer DSL expression if expression supports it If it succeeds, it returns the correct Glimmer DSL expression object Otherwise, it forwards to the next handler configured via ‘#next=` method If there is no handler next, then it raises an error



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/glimmer/dsl/expression_handler.rb', line 25

def handle(parent, keyword, *args, &block)
  Glimmer::Config.logger&.debug "Attempting to handle #{keyword} with #{@expression.class.name.split(":").last}"
  if @expression.can_interpret?(parent, keyword, *args, &block)
    Glimmer::Config.logger&.debug "#{@expression.class.name} will handle expression keyword #{keyword}"
    return @expression
  elsif @next_expression_handler
    return @next_expression_handler.handle(parent, keyword, *args, &block)
  else
    # TODO see if we need a better response here (e.g. dev mode error raising vs production mode silent failure)
    message = "Glimmer keyword #{keyword} with args #{args} cannot be handled"
    message += " inside parent #{parent}" if parent
    message += "! Check the validity of the code."
    # Glimmer::Config.logger&.error message
    raise InvalidKeywordError, message
  end
end

#next=(next_expression_handler) ⇒ Object

Sets the next handler in the expression handler chain of responsibility



43
44
45
# File 'lib/glimmer/dsl/expression_handler.rb', line 43

def next=(next_expression_handler)
  @next_expression_handler = next_expression_handler
end