class Neovim::Host

@api private

Attributes

plugins[R]

Public Class Methods

new(event_loop) click to toggle source
# File lib/neovim/host.rb, line 20
def initialize(event_loop)
  @event_loop = event_loop
  @session = Session.new(event_loop)
  @handlers = {"poll" => poll_handler, "specs" => specs_handler}
  @plugins = []
  @specs = {}
end
run(rplugin_paths, event_loop=EventLoop.stdio) click to toggle source
# File lib/neovim/host.rb, line 14
def self.run(rplugin_paths, event_loop=EventLoop.stdio)
  new(event_loop).tap do |host|
    Loader.new(host).load(rplugin_paths)
  end.run
end

Public Instance Methods

handle(message) click to toggle source
# File lib/neovim/host.rb, line 32
def handle(message)
  log(:debug) { message.to_h }

  @handlers
    .fetch(message.method_name, default_handler)
    .call(@client, message)
rescue Exception => e
  log_exception(:error, e, __method__)

  if message.sync?
    @session.respond(message.id, nil, e.message)
  else
    @client.err_writeln("Exception handling #{message.method_name}: (#{e.class}) #{e.message}")
  end

  raise unless e.is_a?(StandardError)
end
run() click to toggle source
# File lib/neovim/host.rb, line 28
def run
  @session.run { |msg| handle(msg) }
end

Private Instance Methods

default_handler() click to toggle source
# File lib/neovim/host.rb, line 73
def default_handler
  @default_handler ||= lambda do |_, message|
    next unless message.sync?
    @session.respond(message.id, nil, "Unknown request #{message.method_name}")
  end
end
initialize_client(request_id) click to toggle source
# File lib/neovim/host.rb, line 80
def initialize_client(request_id)
  @session.request_id = request_id
  @session.notify(:nvim_set_client_info, *ClientInfo.for_host(self).to_args)

  @client = Client.from_event_loop(@event_loop, @session)
end
initialize_plugins() click to toggle source
# File lib/neovim/host.rb, line 87
def initialize_plugins
  @plugins.each do |plugin|
    plugin.handlers.each do |handler|
      @handlers[handler.qualified_name] = wrap_plugin_handler(handler)
    end

    plugin.setup(@client)
    @specs[plugin.source] = plugin.specs
  end
end
poll_handler() click to toggle source
# File lib/neovim/host.rb, line 52
def poll_handler
  @poll_handler ||= lambda do |_, req|
    initialize_client(req.id)
    initialize_plugins

    @session.respond(req.id, "ok")
  end
end
specs_handler() click to toggle source
# File lib/neovim/host.rb, line 61
def specs_handler
  @specs_handler ||= lambda do |_, req|
    source = req.arguments.fetch(0)

    if @specs.key?(source)
      @session.respond(req.id, @specs.fetch(source))
    else
      @session.respond(req.id, nil, "Unknown plugin #{source}")
    end
  end
end
wrap_plugin_handler(handler) click to toggle source
# File lib/neovim/host.rb, line 98
def wrap_plugin_handler(handler)
  lambda do |client, message|
    args = message.arguments.flatten(1)
    result = handler.call(client, *args)

    @session.respond(message.id, result) if message.sync?
  end
end