Sha256: 37f382089157542845387efc977886a7dde6bdeb2847ab81dc807d8d78d12147

Contents?: true

Size: 1.88 KB

Versions: 3

Compression:

Stored size: 1.88 KB

Contents

module Cardflex
  module Xml
    module Serializer
      require 'rexml/document' unless defined?(REXML::Document)

      TYPE_NAMES = {
        "Symbol" => "symbol",
        "Float" => "number",
        "BigNum" => "number",
        "FixNum" => "number"
      }

      TYPE_CONVERSIONS = {
        "symbol" => proc { |sym| sym.to_s },
        "number" => proc do |num|
          str_num = num.to_s
          if str_num =~ /\.\d$/
            str_num += "0"
          end
          str_num
        end
      }

      def self.hash_to_xml(hash)
        root, contents = hash.keys[0], hash.values[0]

        if contents.is_a? String
          builder = Builder::XmlMarkup.new
          builder.tag!(_xml_escape(root)) { |b| b.text! contents }
        else
          _to_xml(contents, :root => root)
        end
      end

      def self._to_xml(hash, options={})
        raise ArgumentError, "no root specified" unless options[:root]

        options[:indent] ||= 2
        options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
        options[:builder].instruct! unless options.delete(:skip_instruct)

        root = _xml_escape(options[:root])

        options[:builder].tag!(root) do
          hash.each do |key, value|
            case value
            when ::Hash
              _to_xml(value, options.merge(:root => key, :skip_instruct => true))
            else
              type_name = TYPE_NAMES[value.class.name]

              formatted_value = type_name ? TYPE_CONVERSIONS[type_name].call(value) : value
              options[:builder].tag!(_xml_escape(key), formatted_value)
            end
          end
        end
      end

      def self._xml_escape(key)
        dasherized_key = key.to_s.tr('_', '-')

        if Builder::XChar.respond_to?(:encode)
          Builder::XChar.encode(dasherized_key)
        else
          dasherized_key.to_xs
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
cardflex-ruby-0.1.2 lib/cardflex/xml/serializer.rb
cardflex-ruby-0.1.1 lib/cardflex/xml/serializer.rb
cardflex-ruby-0.0.1 lib/cardflex/xml/serializer.rb