class Ellipses::Server::Symbols

Constants

BogusLeafError
CircularReferenceError
EmptyPayloadError
MissingSymbolError

Public Class Methods

new(meta) click to toggle source
# File lib/ellipses/server/symbols.rb, line 78
def initialize(meta)
  @meta     = meta
  @registry = {}

  build
end

Public Instance Methods

[](string) click to toggle source
# File lib/ellipses/server/symbols.rb, line 85
def [](string)
  raise MissingSymbolError, "Missing symbol: #{string}" unless @registry.key? string

  @registry[string]
end
register(string) click to toggle source
# File lib/ellipses/server/symbols.rb, line 97
def register(string)
  _register Symbol.from_string(string)
end
resolve(string) click to toggle source
# File lib/ellipses/server/symbols.rb, line 91
def resolve(string)
  resolved = []
  walk(self[string]) { |symbol| resolved << symbol }
  resolved
end
walk(symbol, &block) click to toggle source
# File lib/ellipses/server/symbols.rb, line 101
def walk(symbol, &block)
  _walk(symbol, Set[symbol], &block)
end

Private Instance Methods

_register(symbol) click to toggle source
# File lib/ellipses/server/symbols.rb, line 131
def _register(symbol)
  @registry[symbol.to_s] || (@registry[symbol.to_s] = symbol)
end
_register_by_meta(symbol_meta) click to toggle source
# File lib/ellipses/server/symbols.rb, line 135
def _register_by_meta(symbol_meta)
  _register Symbol.from_meta(symbol_meta)
end
_walk(symbol, stack) { |symbol| ... } click to toggle source
# File lib/ellipses/server/symbols.rb, line 114
def _walk(symbol, stack, &block)
  return if symbol.depends.nil?

  symbol.depends.each do |depend|
    raise CircularReferenceError, "Circular reference from #{symbol} to #{depend}" if stack.first == depend

    next if stack.include? depend

    stack << depend
    _walk(depend, stack, &block)
  rescue ::StopIteration
    return nil
  end

  yield(symbol) if block
end
build() click to toggle source
# File lib/ellipses/server/symbols.rb, line 107
def build
  @meta.each { |symbol_meta| _register_by_meta(symbol_meta) }
  @registry.dup.each_value { |symbol| symbol.build(self) }

  sanitize
end
sanitize() click to toggle source
# File lib/ellipses/server/symbols.rb, line 139
def sanitize
  tap do
    @registry.each_value { |symbol| walk(symbol) }
  end
end