class Gamefic::Request
Build actions from text.
Active#perform
uses Request
to parse user input into actions for execution by the Dispatcher
.
Attributes
@return [Actor]
@return [String]
Public Class Methods
Source
# File lib/gamefic/request.rb, line 12 def initialize(actor, input) @actor = actor @input = input end
@param actor [Actor] @param input [String]
Public Instance Methods
Source
# File lib/gamefic/request.rb, line 18 def to_actions Action.sort( Syntax.tokenize(input, actor.narratives.syntaxes) .flat_map { |expression| expression_to_actions(expression) } ) end
@return [Array<Action>]
Private Instance Methods
Source
# File lib/gamefic/request.rb, line 33 def expression_to_actions(expression) Gamefic.logger.info "Evaluating #{expression.inspect}" actor.narratives .responses_for(expression.verb) .map { |response| match_expression response, expression } .compact end
Source
# File lib/gamefic/request.rb, line 41 def match_expression(response, expression) return nil if expression.tokens.length > response.queries.length remainder = '' matches = response.queries .zip(expression.tokens) .each_with_object([]) do |zipped, results| query, token = zipped result = query.filter(actor, "#{remainder} #{token}".strip) return nil unless result.match results.push Match.new(result.match, token.to_s[0..-result.remainder.length - 1], result.strictness) remainder = result.remainder end return nil unless remainder.empty? Action.new(actor, response, matches, input) end