def deserialize node, type=nil
type_attr = node['type']
type = type_attr if type_attr
if action = BUILTIN_TYPE_ACTIONS[type]
case action
when :string
node.content
when :boolean
node.content == '1' || node.content == 'true'
when :int
node.content.to_i
when :float
node.content.to_f
when :date
leaf_date node
when :binary
leaf_binary node
when :keyvalue
leaf_keyvalue node
else fail
end
else
if type =~ /^ArrayOf/
type = DEMANGLED_ARRAY_TYPES[$'] || $'
return node.children.select(&:element?).map { |c| deserialize c, type }
end
klass = @loader.get(type) or fail "no such type #{type}"
case klass.kind
when :data
traverse_data node, klass
when :enum
node.content
when :managed
leaf_managed node, klass
else fail
end
end
end