Class: Rubycli::EvalCoercer

Inherits:
Object
  • Object
show all
Defined in:
lib/rubycli/eval_coercer.rb

Constant Summary collapse

THREAD_KEY =
:rubycli_eval_mode
LAX_THREAD_KEY =
:rubycli_eval_lax_mode
BINDING_THREAD_KEY =
:rubycli_eval_binding

Instance Method Summary collapse

Instance Method Details

#coerce_eval_value(value) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rubycli/eval_coercer.rb', line 41

def coerce_eval_value(value)
  case value
  when String
    evaluate_string(value)
  when Array
    value.map { |item| coerce_eval_value(item) }
  when Hash
    value.transform_values { |item| coerce_eval_value(item) }
  else
    value
  end
rescue SyntaxError, StandardError => e
  raise Rubycli::ArgumentError, "Failed to evaluate Ruby code: #{e.message}"
end

#eval_lax_mode?Boolean

Returns:

  • (Boolean)


13
14
15
# File 'lib/rubycli/eval_coercer.rb', line 13

def eval_lax_mode?
  Thread.current[LAX_THREAD_KEY] == true
end

#eval_mode?Boolean

Returns:

  • (Boolean)


9
10
11
# File 'lib/rubycli/eval_coercer.rb', line 9

def eval_mode?
  Thread.current[THREAD_KEY] == true
end

#with_eval_bindingObject



33
34
35
36
37
38
39
# File 'lib/rubycli/eval_coercer.rb', line 33

def with_eval_binding
  previous_binding = Thread.current[BINDING_THREAD_KEY]
  Thread.current[BINDING_THREAD_KEY] = isolated_binding
  yield
ensure
  Thread.current[BINDING_THREAD_KEY] = previous_binding
end

#with_eval_mode(enabled = true, lax: false, reuse_binding: false) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/rubycli/eval_coercer.rb', line 17

def with_eval_mode(enabled = true, lax: false, reuse_binding: false)
  previous = Thread.current[THREAD_KEY]
  previous_lax = Thread.current[LAX_THREAD_KEY]
  previous_binding = Thread.current[BINDING_THREAD_KEY]
  Thread.current[THREAD_KEY] = enabled
  Thread.current[LAX_THREAD_KEY] = enabled && lax
  if enabled
    Thread.current[BINDING_THREAD_KEY] = reuse_binding && previous_binding ? previous_binding : isolated_binding
  end
  yield
ensure
  Thread.current[THREAD_KEY] = previous
  Thread.current[LAX_THREAD_KEY] = previous_lax
  Thread.current[BINDING_THREAD_KEY] = previous_binding
end