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