class Babl::Nodes::TerminalValue
A TerminalValue
node is always implicitly added to the end of the chain during compilation. It basically ensures that the output contains only primitives, arrays and hashes.
Public Instance Methods
dependencies()
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 19 def dependencies Utils::Hash::EMPTY end
optimize()
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 44 def optimize self end
pinned_dependencies()
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 23 def pinned_dependencies Utils::Hash::EMPTY end
render(frame)
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 27 def render(frame) render_object(frame.object) rescue TerminalValueError => e raise Errors::RenderingError, "#{e.message}\n" + frame.formatted_stack(e.babl_stack), e.backtrace end
render_object(obj, stack = nil)
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 33 def render_object(obj, stack = nil) case obj when ::String, ::Integer, ::NilClass, ::TrueClass, ::FalseClass then obj when ::Numeric then obj.to_f when ::Symbol then obj.to_s when ::Hash then render_hash(obj, stack || []) when ::Array then render_array(obj, stack || []) else raise TerminalValueError.new("Only primitives can be serialized: #{obj.inspect}", stack || []) end end
schema()
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 15 def schema Schema::Anything.instance end
Private Instance Methods
render_array(array, stack)
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 50 def render_array(array, stack) array.each_with_index.map { |obj, index| stack.push index out = render_object(obj, stack) stack.pop out } end
render_hash(hash, stack)
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 59 def render_hash(hash, stack) out = {} hash.each { |k, v| key = render_key(k, stack) stack.push key out[key] = render_object(v, stack) stack.pop } out end
render_key(key, stack)
click to toggle source
# File lib/babl/nodes/terminal_value.rb, line 70 def render_key(key, stack) case key when ::Symbol then key when ::String then key.to_sym # rubocop:disable Lint/BooleanSymbol when ::TrueClass then :true when ::FalseClass then :false # rubocop:enable Lint/BooleanSymbol when ::Numeric, ::NilClass then :"#{key}" else raise TerminalValueError.new("Invalid key for JSON object: #{key.inspect}", stack) end end