Sha256: ac1a3cb1343454731812895119e1dac7ce5e605961d6b2702c85a03846636048

Contents?: true

Size: 1.7 KB

Versions: 1

Compression:

Stored size: 1.7 KB

Contents

require 'representable/binding'

module Representable
  module YAML
    module ObjectBinding
      include Binding::Object
      
      def serialize_method
        :to_ast
      end
      
      def deserialize_method
        :from_hash
      end

      def write_scalar(value)
        value
      end
    end

    class YAMLBinding < Representable::Binding
      def initialize(definition) # FIXME. make generic.
        super
        extend ObjectBinding if definition.typed?
      end
      
      def read(hash)
        return FragmentNotFound unless hash.has_key?(definition.from) # DISCUSS: put it all in #read for performance. not really sure if i like returning that special thing.
        
        fragment = hash[definition.from]
        deserialize_from(fragment)
      end
      
      def write(map, value)
        map.children << Psych::Nodes::Scalar.new(definition.from)
        map.children << serialize_for(value)  # FIXME: should be serialize.
      end
    end
    
    
    class PropertyBinding < YAMLBinding
      def serialize_for(value)
        write_scalar serialize(value)
      end
      
      def deserialize_from(fragment)
        deserialize(fragment)
      end

      def write_scalar(value)
        Psych::Nodes::Scalar.new(value.to_s)
      end
    end
    
    
    class CollectionBinding < PropertyBinding
      def serialize_for(value)
        Psych::Nodes::Sequence.new.tap do |seq|
          seq.style = Psych::Nodes::Sequence::FLOW if definition.options[:style] == :flow
          value.each { |obj| seq.children << super(obj) }
        end
      end
      
      def deserialize_from(fragment)
        fragment.collect { |item_fragment| deserialize(item_fragment) }
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
representable-1.2.5 lib/representable/bindings/yaml_bindings.rb