Module: Clamo::JSONRPC

Defined in:
lib/clamo/jsonrpc.rb

Defined Under Namespace

Modules: ProtocolErrors

Constant Summary collapse

PROTOCOL_VERSION_PRAGMA =
{ jsonrpc: "2.0" }.freeze

Class Method Summary collapse

Class Method Details

.build_error_response(**opts) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
# File 'lib/clamo/jsonrpc.rb', line 72

def build_error_response **opts
  # raise if no error code present
  # raise if no error message present
  { jsonrpc: "2.0",
    id: opts[:id],
    error: {
      code: opts.dig(:error, :code),
      message: opts.dig(:error, :message),
      data: opts.dig(:error, :data)
    }.reject { |k, _| k == :data && !opts[:error].key?(:data) } }
end

.build_error_response_from(**opts) ⇒ Object



84
85
86
87
88
89
90
91
92
# File 'lib/clamo/jsonrpc.rb', line 84

def build_error_response_from **opts
  # raise unless opts[:descriptor]
  opts.merge(
    { error:
      { code: opts[:descriptor].code,
        message: opts[:descriptor].message } }
  )
      .then { |hash| build_error_response(**hash) }
end

.build_error_response_parse_error(**opts) ⇒ Object



94
95
96
97
98
99
100
101
# File 'lib/clamo/jsonrpc.rb', line 94

def build_error_response_parse_error **opts
  opts.merge(
    { error:
      { code: ProtocolErrors::PARSE_ERROR.code,
        message: ProtocolErrors::PARSE_ERROR.message } }
  )
      .then { |hash| build_error_response(**hash) }
end

.build_request(**opts) ⇒ Object



57
58
59
60
61
62
63
64
# File 'lib/clamo/jsonrpc.rb', line 57

def build_request **opts
  # raise if no method present
  # raise if params present, but not an array
  { jsonrpc: "2.0",
    method: opts[:method] }
    .merge({ params: opts[:params] })
    .merge(opts.key?(:id) ? { id: opts[:id] } : {})
end

.build_result_response(id:, result:) ⇒ Object



66
67
68
69
70
# File 'lib/clamo/jsonrpc.rb', line 66

def build_result_response(id:, result:)
  {}.merge(PROTOCOL_VERSION_PRAGMA)
    .merge({ result: result })
    .merge({ id: id })
end

.proper_id_if_any?(request) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
31
32
33
34
35
36
# File 'lib/clamo/jsonrpc.rb', line 28

def proper_id_if_any?(request)
  if request.key?("id")
    request["id"].is_a?(String) ||
      request["id"].is_a?(Integer) ||
      request["id"].is_a?(NilClass)
  else
    true
  end
end

.proper_method?(request) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/clamo/jsonrpc.rb', line 24

def proper_method?(request)
  request["method"].is_a?(String)
end

.proper_params_if_any?(request) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
41
42
43
44
# File 'lib/clamo/jsonrpc.rb', line 38

def proper_params_if_any?(request)
  if request.key?("params")
    request["params"].is_a?(Array) || request["params"].is_a?(Hash)
  else
    true
  end
end

.proper_pragma?(request) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/clamo/jsonrpc.rb', line 20

def proper_pragma?(request)
  request["jsonrpc"] == "2.0"
end

.valid_params?(request) ⇒ Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/clamo/jsonrpc.rb', line 53

def valid_params?(request)
  proper_params_if_any?(request)
end

.valid_request?(request) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
50
51
# File 'lib/clamo/jsonrpc.rb', line 46

def valid_request?(request)
  request.is_a?(Hash) &&
    proper_pragma?(request) &&
    proper_method?(request) &&
    proper_id_if_any?(request)
end