class Lsp::FileLanguageServer
Attributes
implementation[R]
input[R]
logger[R]
output[R]
Public Class Methods
new(implementation, input = $stdin, output = $stdout, logger: Logger.new(nil))
click to toggle source
# File lib/lsp/file_language_server.rb, line 6 def initialize(implementation, input = $stdin, output = $stdout, logger: Logger.new(nil)) @implementation = implementation @input = input @output = output @logger = logger end
Public Instance Methods
build_message(hash)
click to toggle source
# File lib/lsp/file_language_server.rb, line 66 def build_message(hash) json = hash.to_json "Content-Length: #{json.size}\r\n\r\n#{json}" end
prepare()
click to toggle source
# File lib/lsp/file_language_server.rb, line 50 def prepare implementation.language_server = self end
response(id, result, error)
click to toggle source
# File lib/lsp/file_language_server.rb, line 54 def response(id, result, error) payload = { jsonrpc: "2.0", id: id, result: result, error: error, } output.write(build_message(payload)) output.flush logger.info("SEND #{payload}") end
start()
click to toggle source
# File lib/lsp/file_language_server.rb, line 13 def start prepare loop do headers = {} loop do header_line = input.readline.strip if header_line.empty? if headers.empty? redo else break end end header_name, header_value = header_line.split(":", 2) headers[header_name] = header_value.strip end body_raw = input.read(headers["Content-Length"].to_i) body_json = JSON.parse(body_raw, symbolize_names: true) logger.info("RECV #{body_json}") if body_json.key?(:id) implementation.request( body_json.fetch(:id), body_json.fetch(:method), body_json.fetch(:params)) else implementation.notify( body_json.fetch(:method), body_json.fetch(:params)) end end rescue EOFError rescue => e logger.error("Server failed because of #{e}") end