File: remote_module.rb

package info (click to toggle)
ruby-neovim 0.10.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 548 kB
  • sloc: ruby: 4,178; sh: 23; makefile: 4
file content (42 lines) | stat: -rw-r--r-- 1,024 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
require "neovim/client"
require "neovim/event_loop"
require "neovim/logging"
require "neovim/remote_module/dsl"
require "neovim/session"

module Neovim
  class RemoteModule
    include Logging

    def self.from_config_block(&block)
      new(DSL::new(&block).handlers)
    end

    def initialize(handlers)
      @handlers = handlers
    end

    def start
      event_loop = EventLoop.stdio
      session = Session.new(event_loop)
      client = nil

      session.run do |message|
        case message
        when Message::Request
          begin
            client ||= Client.from_event_loop(event_loop, session)
            args = message.arguments.flatten(1)

            @handlers[message.method_name].call(client, *args).tap do |rv|
              session.respond(message.id, rv, nil) if message.sync?
            end
          rescue => e
            log_exception(:error, e, __method__)
            session.respond(message.id, nil, e.message) if message.sync?
          end
        end
      end
    end
  end
end