Sha256: ac99890b8c57ca5e858f423d22256ec6e027732379ffe3d728d956a510494493

Contents?: true

Size: 1.82 KB

Versions: 2

Compression:

Stored size: 1.82 KB

Contents

require "psych"
require "base64"

module SafeYAML
  class PsychHandler < Psych::Handler
    def initialize
      @anchors = {}
      @stack = []
      @current_key = nil
      @result = nil
    end

    def result
      @result
    end

    def add_to_current_structure(value, anchor=nil, quoted=nil, tag=nil)
      value = Transform.to_proper_type(value, quoted, tag)

      @anchors[anchor] = value if anchor

      if @result.nil?
        @result = value
        @current_structure = @result
        return
      end

      case @current_structure
      when Array
        @current_structure.push(value)

      when Hash
        if @current_key.nil?
          @current_key = value

        else
          if @current_key == "<<"
            @current_structure.merge!(value)
          else
            @current_structure[@current_key] = value
          end

          @current_key = nil
        end

      else
        raise "Don't know how to add to a #{@current_structure.class}!"
      end
    end

    def end_current_structure
      @stack.pop
      @current_structure = @stack.last
    end

    def streaming?
      false
    end

    # event handlers
    def alias(anchor)
      add_to_current_structure(@anchors[anchor])
    end

    def scalar(value, anchor, tag, plain, quoted, style)
      add_to_current_structure(value, anchor, quoted, tag)
    end

    def start_mapping(anchor, tag, implicit, style)
      map = {}
      self.add_to_current_structure(map, anchor)
      @current_structure = map
      @stack.push(map)
    end

    def end_mapping
      self.end_current_structure()
    end

    def start_sequence(anchor, tag, implicit, style)
      seq = []
      self.add_to_current_structure(seq, anchor)
      @current_structure = seq
      @stack.push(seq)
    end

    def end_sequence
      self.end_current_structure()
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
safe_yaml-0.7.1 lib/safe_yaml/psych_handler.rb
safe_yaml-0.7.0 lib/safe_yaml/psych_handler.rb