Class: ThemeCheck::LanguageServer::Bridge

Inherits:
Object
  • Object
show all
Defined in:
lib/theme_check/language_server/bridge.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(messenger) ⇒ Bridge

Returns a new instance of Bridge.



25
26
27
28
29
30
31
32
# File 'lib/theme_check/language_server/bridge.rb', line 25

def initialize(messenger)
  # The messenger is responsible for IO.
  # Could be STDIO or WebSockets or Mock.
  @messenger = messenger

  # Whether the client supports work done progress notifications
  @supports_work_done_progress = false
end

Instance Attribute Details

#supports_work_done_progress=(value) ⇒ Object (writeonly)

Sets the attribute supports_work_done_progress

Parameters:

  • value

    the value to set the attribute supports_work_done_progress to.



23
24
25
# File 'lib/theme_check/language_server/bridge.rb', line 23

def supports_work_done_progress=(value)
  @supports_work_done_progress = value
end

Instance Method Details

#log(message) ⇒ Object



34
35
36
# File 'lib/theme_check/language_server/bridge.rb', line 34

def log(message)
  @messenger.log(message)
end

#read_messageObject



38
39
40
41
42
43
# File 'lib/theme_check/language_server/bridge.rb', line 38

def read_message
  message_body = @messenger.read_message
  message_json = JSON.parse(message_body, symbolize_names: true)
  @messenger.log(JSON.pretty_generate(message_json)) if ThemeCheck.debug?
  message_json
end

#receive_response(id, result) ⇒ Object



64
65
66
# File 'lib/theme_check/language_server/bridge.rb', line 64

def receive_response(id, result)
  Channel.by_id(id) << result
end

#send_create_work_done_progress_request(token) ⇒ Object



106
107
108
109
110
111
# File 'lib/theme_check/language_server/bridge.rb', line 106

def send_create_work_done_progress_request(token)
  return unless supports_work_done_progress?
  send_request("window/workDoneProgress/create", {
    token: token,
  })
end

#send_internal_error(id, e) ⇒ Object



80
81
82
83
84
85
86
87
88
# File 'lib/theme_check/language_server/bridge.rb', line 80

def send_internal_error(id, e)
  send_response(id, nil, {
    code: ErrorCodes::INTERNAL_ERROR,
    message: <<~EOS,
      #{e.class}: #{e.message}
        #{e.backtrace.join("\n  ")}
    EOS
  })
end

#send_message(message_hash) ⇒ Object



45
46
47
48
49
50
# File 'lib/theme_check/language_server/bridge.rb', line 45

def send_message(message_hash)
  message_hash[:jsonrpc] = '2.0'
  message_body = JSON.dump(message_hash)
  @messenger.log(JSON.pretty_generate(message_hash)) if ThemeCheck.debug?
  @messenger.send_message(message_body)
end

#send_notification(method, params) ⇒ Object



91
92
93
94
95
# File 'lib/theme_check/language_server/bridge.rb', line 91

def send_notification(method, params)
  message = { method: method }
  message[:params] = params
  send_message(message)
end

#send_progress(token, value) ⇒ Object



98
99
100
# File 'lib/theme_check/language_server/bridge.rb', line 98

def send_progress(token, value)
  send_notification("$/progress", token: token, value: value)
end

#send_request(method, params = nil) ⇒ Object



53
54
55
56
57
58
59
60
61
62
# File 'lib/theme_check/language_server/bridge.rb', line 53

def send_request(method, params = nil)
  channel = Channel.create
  message = { id: channel.id }
  message[:method] = method
  message[:params] = params if params
  send_message(message)
  channel.pop
ensure
  channel.close
end

#send_response(id, result = nil, error = nil) ⇒ Object



69
70
71
72
73
74
75
76
77
# File 'lib/theme_check/language_server/bridge.rb', line 69

def send_response(id, result = nil, error = nil)
  message = { id: id }
  if error
    message[:error] = error
  else
    message[:result] = result
  end
  send_message(message)
end

#send_work_done_progress_begin(token, title) ⇒ Object



113
114
115
116
117
118
119
120
121
# File 'lib/theme_check/language_server/bridge.rb', line 113

def send_work_done_progress_begin(token, title)
  return unless supports_work_done_progress?
  send_progress(token, {
    kind: 'begin',
    title: title,
    cancellable: false,
    percentage: 0,
  })
end

#send_work_done_progress_end(token, message) ⇒ Object



133
134
135
136
137
138
139
# File 'lib/theme_check/language_server/bridge.rb', line 133

def send_work_done_progress_end(token, message)
  return unless supports_work_done_progress?
  send_progress(token, {
    kind: 'end',
    message: message,
  })
end

#send_work_done_progress_report(token, message, percentage) ⇒ Object



123
124
125
126
127
128
129
130
131
# File 'lib/theme_check/language_server/bridge.rb', line 123

def send_work_done_progress_report(token, message, percentage)
  return unless supports_work_done_progress?
  send_progress(token, {
    kind: 'report',
    message: message,
    cancellable: false,
    percentage: percentage,
  })
end

#supports_work_done_progress?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/theme_check/language_server/bridge.rb', line 102

def supports_work_done_progress?
  @supports_work_done_progress
end