class Gamefic::Query::Base
and integers.
Most queries return entities, but there are also queries for plain text
a response callback.
Each query matches a command token to an object that can be passed into
A base class for entity-based queries that can be applied to responses.
def self.plain
def self.plain @plain ||= new end
def self.span(subject)
def self.span(subject) plain.span(subject) end
def accept?(subject, object)
-
(Boolean)
-
Parameters:
-
object
(Entity
) -- -
subject
(Entity
) --
def accept?(subject, object) select(subject).include?(object) end
def bind(narrative)
def bind(narrative) clone.tap do |query| query.instance_exec do @arguments = narrative.unproxy(@arguments) end end end
def calculate_precision
def calculate_precision arguments.sum(0) do |arg| case arg when Entity, Proxy::Base 1000 when Class, Module class_depth(arg) * 100 else 1 end end end
def class_depth(klass)
def class_depth(klass) return 1 unless klass.is_a?(Class) depth = 1 sup = klass depth += 1 while (sup = sup.superclass) depth end
def filter(subject, token)
-
(Result)
-
Parameters:
-
token
(String
) -- -
subject
(Gamefic::Entity
) --
def filter(subject, token) scan = Scanner.scan(select(subject), token) return Result.new(nil, scan.token) unless scan.matched.one? Result.new(scan.matched.first, scan.remainder, scan.strictness) end
def initialize *arguments, name: self.class.to_s
-
name
(String
) -- -
arguments
(Array
) --
Raises:
-
(ArgumentError)
- if any of the arguments are nil
def initialize *arguments, name: self.class.to_s raise ArgumentError, "nil argument in query" if arguments.any?(&:nil?) @arguments = arguments @name = name end
def inspect
def inspect "#{name}(#{arguments.map(&:inspect).join(', ')})" end
def name
def name @name || self.class.to_s end
def precision
-
(::Integer)
-
def precision @precision ||= calculate_precision end
def select(subject)
-
(Array
-)
Parameters:
-
subject
(Entity
) --
def select(subject) span(subject).that_are(*arguments) end
def span(_subject)
-
(Array
-)
Parameters:
-
subject
(Entity
) --
def span(_subject) [] end