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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
require "neovim/logging"
module Neovim
# @api private
class Message
def self.from_array((kind, *payload))
case kind
when 0
request(*payload)
when 1
reqid, (_, error), value = payload
response(reqid, error, value)
when 2
notification(*payload)
else
raise "Unknown message type #{kind.inspect}"
end
end
def self.request(id, method, args)
Request.new(id, method, args)
end
def self.response(request_id, error, value)
Response.new(request_id, error, value)
end
def self.notification(method, args)
Notification.new(method, args)
end
Request = Struct.new(:id, :method_name, :arguments) do
def to_a
[0, id, method_name, arguments]
end
def received(_)
yield self
end
def sync?
true
end
end
Response = Struct.new(:request_id, :error, :value) do
def to_a
[1, request_id, error, value]
end
def received(handlers)
handlers.delete(request_id).call(self)
end
end
Notification = Struct.new(:method_name, :arguments) do
def to_a
[2, method_name, arguments]
end
def received(_)
yield self
end
def sync?
false
end
end
end
end
|