Exception: SurrealDB::ServerError

Inherits:
Error
  • Object
show all
Defined in:
lib/surrealdb/errors.rb

Overview

Base class for errors returned by the SurrealDB server. Supports both legacy (code + message) and v3 structured (kind + details + cause chain) error formats.

Constant Summary collapse

KIND_TO_CLASS =

Populated after subclasses are defined at the bottom of this file.

{}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(message = nil, code: nil, kind: nil, details: nil, server_cause: nil) ⇒ ServerError

Returns a new instance of ServerError.



30
31
32
33
34
35
36
# File 'lib/surrealdb/errors.rb', line 30

def initialize(message = nil, code: nil, kind: nil, details: nil, server_cause: nil)
  @code = code
  @kind = kind
  @details = details
  @server_cause = server_cause
  super(message)
end

Instance Attribute Details

#codeInteger? (readonly)

Returns JSON-RPC error code.

Returns:

  • (Integer, nil)

    JSON-RPC error code



19
20
21
# File 'lib/surrealdb/errors.rb', line 19

def code
  @code
end

#detailsHash? (readonly)

Returns additional error details.

Returns:

  • (Hash, nil)

    additional error details



25
26
27
# File 'lib/surrealdb/errors.rb', line 25

def details
  @details
end

#kindString? (readonly)

Returns structured error kind (e.g. "NotFound", "NotAllowed").

Returns:

  • (String, nil)

    structured error kind (e.g. "NotFound", "NotAllowed")



22
23
24
# File 'lib/surrealdb/errors.rb', line 22

def kind
  @kind
end

#server_causeServerError? (readonly)

Returns chained cause from the server.

Returns:



28
29
30
# File 'lib/surrealdb/errors.rb', line 28

def server_cause
  @server_cause
end

Class Method Details

.from_response(data) ⇒ ServerError

Builds the appropriate ServerError subclass from a parsed error hash.

Parameters:

  • data (Hash)

    parsed error data with string keys

Returns:



63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/surrealdb/errors.rb', line 63

def self.from_response(data)
  return new(data.to_s) unless data.is_a?(Hash)

  kind = data['kind']
  message = data['message'] || data['msg']
  code = data['code']
  details = data['details']

  raw_cause = data['cause']
  cause = raw_cause.is_a?(Hash) ? from_response(raw_cause) : nil

  klass = KIND_TO_CLASS.fetch(kind, self)
  klass.new(message, code: code, kind: kind, details: details, server_cause: cause)
end

Instance Method Details

#find_cause(target_kind) ⇒ ServerError?

Walk the cause chain looking for a specific kind.

Parameters:

  • target_kind (String)

Returns:



41
42
43
44
45
46
47
48
49
# File 'lib/surrealdb/errors.rb', line 41

def find_cause(target_kind)
  current = self
  while current
    return current if current.kind == target_kind

    current = current.server_cause
  end
  nil
end

#has_kind?(target_kind) ⇒ Boolean

Parameters:

  • target_kind (String)

Returns:

  • (Boolean)


53
54
55
# File 'lib/surrealdb/errors.rb', line 53

def has_kind?(target_kind) # rubocop:disable Naming/PredicatePrefix
  !find_cause(target_kind).nil?
end