Class: Rubycli::EvalCoercer
- Inherits:
-
Object
- Object
- Rubycli::EvalCoercer
- 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
- #coerce_eval_value(value) ⇒ Object
- #eval_lax_mode? ⇒ Boolean
- #eval_mode? ⇒ Boolean
- #with_eval_binding ⇒ Object
- #with_eval_mode(enabled = true, lax: false, reuse_binding: false) ⇒ Object
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.}" end |
#eval_lax_mode? ⇒ 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
9 10 11 |
# File 'lib/rubycli/eval_coercer.rb', line 9 def eval_mode? Thread.current[THREAD_KEY] == true end |
#with_eval_binding ⇒ Object
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 |