Module: Gienah::Plugin
- Defined in:
- lib/gienah/plugin.rb,
sig/gienah.rbs
Class Method Summary collapse
- .call(method, params = {}) ⇒ Object
- .capability?(name) ⇒ Boolean
- .dispatch(message) ⇒ Object
- .export(name) {|arg0| ... } ⇒ nil
- .exports ⇒ Object
- .handle_notification(message) ⇒ Object
- .handle_request(message) ⇒ Object
- .listeners ⇒ Object
- .next_id ⇒ Object
- .notify(method, params = {}) ⇒ nil
- .on(event) {|arg0| ... } ⇒ nil
- .reset! ⇒ Object
- .response_value(message) ⇒ Object
- .run(input: $stdin, output: $stdout) ⇒ nil
- .running? ⇒ Boolean
- .write(message) ⇒ Object
Class Method Details
.call(method, params = {}) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/gienah/plugin.rb', line 23 def call(method, params = {}) raise LifecycleError, "plugin is not running" unless running? id = next_id write(Protocol.request(id, method, params)) loop do = Protocol.read(@input) raise Error, "host closed the connection" unless return response_value() if ["id"] == id && !.key?("method") dispatch() end end |
.capability?(name) ⇒ Boolean
44 45 46 |
# File 'lib/gienah/plugin.rb', line 44 def capability?(name) @capabilities.include?(name.to_s) end |
.dispatch(message) ⇒ Object
96 97 98 99 100 101 102 103 104 |
# File 'lib/gienah/plugin.rb', line 96 def dispatch() if .key?("method") if .key?("id") write(handle_request()) else handle_notification() end end end |
.export(name) {|arg0| ... } ⇒ nil
7 8 9 10 11 12 13 |
# File 'lib/gienah/plugin.rb', line 7 def export(name, &handler) raise ArgumentError, "name must be a nonempty String" unless name.is_a?(String) && !name.empty? raise ArgumentError, "handler required" unless handler exports[name] = handler nil end |
.exports ⇒ Object
75 76 77 |
# File 'lib/gienah/plugin.rb', line 75 def exports @exports ||= {} end |
.handle_notification(message) ⇒ Object
128 129 130 |
# File 'lib/gienah/plugin.rb', line 128 def handle_notification() listeners.fetch(["method"], []).each { |listener| listener.call(.fetch("params", {})) } end |
.handle_request(message) ⇒ Object
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/gienah/plugin.rb', line 106 def handle_request() method = ["method"] params = .fetch("params", {}) case method when "initialize" @capabilities = Array(params["capabilities"]).map(&:to_s).freeze Protocol.response(["id"], result: {"api_version" => params["api_version"]}) when "shutdown" @stopped = true Protocol.response(["id"], result: nil) else handler = exports[method] unless handler return Protocol.response(["id"], error: {"code" => -32601, "message" => "method not found: #{method}"}) end result = handler.arity == 1 ? handler.call(params) : handler.call(self, params) Protocol.response(["id"], result: result) end rescue StandardError => error Protocol.response(["id"], error: {"code" => -32000, "message" => "#{error.class}: #{error.}"}) end |
.listeners ⇒ Object
79 80 81 |
# File 'lib/gienah/plugin.rb', line 79 def listeners @listeners ||= Hash.new { |hash, key| hash[key] = [] } end |
.next_id ⇒ Object
87 88 89 |
# File 'lib/gienah/plugin.rb', line 87 def next_id @sequence = (@sequence || 0) + 1 end |
.notify(method, params = {}) ⇒ nil
37 38 39 40 41 42 |
# File 'lib/gienah/plugin.rb', line 37 def notify(method, params = {}) raise LifecycleError, "plugin is not running" unless running? write(Protocol.notification(method, params)) nil end |
.on(event) {|arg0| ... } ⇒ nil
15 16 17 18 19 20 21 |
# File 'lib/gienah/plugin.rb', line 15 def on(event, &handler) raise ArgumentError, "event must be a nonempty String" unless event.is_a?(String) && !event.empty? raise ArgumentError, "handler required" unless handler listeners[event] << handler nil end |
.reset! ⇒ Object
66 67 68 69 70 71 72 73 |
# File 'lib/gienah/plugin.rb', line 66 def reset! @exports = {} @listeners = Hash.new { |hash, key| hash[key] = [] } @capabilities = [] @sequence = 0 @running = false nil end |
.response_value(message) ⇒ Object
132 133 134 135 136 |
# File 'lib/gienah/plugin.rb', line 132 def response_value() raise Error, .fetch("error").fetch("message") if .key?("error") ["result"] end |
.run(input: $stdin, output: $stdout) ⇒ nil
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/gienah/plugin.rb', line 48 def run(input: $stdin, output: $stdout) @input = input @output = output @input.binmode if @input.respond_to?(:binmode) @output.binmode if @output.respond_to?(:binmode) @running = true loop do = Protocol.read(@input) break unless dispatch() break if @stopped end nil ensure @running = false end |
.running? ⇒ Boolean
83 84 85 |
# File 'lib/gienah/plugin.rb', line 83 def running? !!@running end |