53 lines
1.0 KiB
Ruby
53 lines
1.0 KiB
Ruby
module SafeYAML
|
|
class PsychResolver < Resolver
|
|
NODE_TYPES = {
|
|
Psych::Nodes::Document => :root,
|
|
Psych::Nodes::Mapping => :map,
|
|
Psych::Nodes::Sequence => :seq,
|
|
Psych::Nodes::Scalar => :scalar,
|
|
Psych::Nodes::Alias => :alias
|
|
}.freeze
|
|
|
|
def initialize(options={})
|
|
super
|
|
@aliased_nodes = {}
|
|
end
|
|
|
|
def resolve_root(root)
|
|
resolve_seq(root).first
|
|
end
|
|
|
|
def resolve_alias(node)
|
|
resolve_node(@aliased_nodes[node.anchor])
|
|
end
|
|
|
|
def native_resolve(node)
|
|
@visitor ||= SafeYAML::SafeToRubyVisitor.new(self)
|
|
@visitor.accept(node)
|
|
end
|
|
|
|
def get_node_type(node)
|
|
NODE_TYPES[node.class]
|
|
end
|
|
|
|
def get_node_tag(node)
|
|
node.tag
|
|
end
|
|
|
|
def get_node_value(node)
|
|
@aliased_nodes[node.anchor] = node if node.respond_to?(:anchor) && node.anchor
|
|
|
|
case get_node_type(node)
|
|
when :root, :map, :seq
|
|
node.children
|
|
when :scalar
|
|
node.value
|
|
end
|
|
end
|
|
|
|
def value_is_quoted?(node)
|
|
node.quoted
|
|
end
|
|
end
|
|
end
|