Skip to content

Instantly share code, notes, and snippets.

@mrcsparker
Created June 30, 2015 04:39
Show Gist options
  • Save mrcsparker/7160234f4db0c172758e to your computer and use it in GitHub Desktop.
Save mrcsparker/7160234f4db0c172758e to your computer and use it in GitHub Desktop.
NRepl for Ruby: simple nrepl client for Ruby 2+
require 'socket'
require 'bencode'
require 'securerandom'
module Loader
class NRepl
def self.connect(server, port)
new(server, port)
end
def initialize(server, port)
@port = port
@server = server
@conn = TCPSocket.new server, port
@parser = BEncode::Parser.new(@conn)
@session = op(:clone).select { |s| s['new-session'] }.first['new-session']
end
def send message
msg = message.dup
msg['id'] ||= SecureRandom.uuid
@conn.write(msg.bencode)
msg['id']
end
def recv message_id
responses = []
responses << @parser.parse! until !responses.empty? && responses.last.fetch("status", []).include?("done")
responses
end
def op(name, opts = {})
opts.keys.each do |key|
opts[key.to_s] = opts.delete(key)
end
opts['op'] = name.to_s
recv(send(opts))
end
def list_sessions
op(:'ls-sessions', session: @session).map { |s| s['sessions'] }.first
end
def describe
op(:describe, session: @session)
end
def load_file(file)
op(:'load-file', file: file, session: @session)
end
def close_session(s)
return if s.to_s == @session
op(:close, session: s)
end
def eval code
op(:eval, code: code, session: @session).select { |s| s['value'] }
end
def value code
retval = op(:eval, code: code, session: @session).select { |s| s['value'] }
return retval.first['value'] if retval.size > 0
{}
end
def close
op(:close, session: @session)
@conn.close
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment