Sha256: 38b3111a452048706cce0b4575bebb877bdcefd277f67fdb623372db58899d8a

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

module MusicXML
  module Node
    module JsonExport
      def to_json
        { json_key => json_values }.to_json
      end

      def json_key
        self.class.name.split('::').last.gsub(/^([A-Z])/) { $1.downcase }
      end

      def json_values
        output = {}
        load_plural_attrs(output)
        load_singular_attrs(output)
        load_plural_nodes(output)
        load_singular_nodes(output)
        output
      end

      private

      def jsify(name)
        name.to_s.gsub(/(_[a-z])/) { $1.upcase[1..-1] }
      end

      def load_plural_attrs(output)
        self.class.config.plural_attrs.each do |name|
          output[jsify(name)] = send(name) || []
        end
      end

      def load_plural_nodes(output)
        self.class.config.plural_nodes.each do |name|
          nodes = send(name)
          output[jsify(name)] = nodes ? nodes.map(&:json_values) : []
        end
      end

      def load_singular_attrs(output)
        (self.class.config.properties + self.class.config.singular_attrs).each do |name|
          output[jsify(name)] = send(name)
        end
      end

      def load_singular_nodes(output)
        self.class.config.singular_nodes.each do |name|
          node = send(name)
          output[jsify(name)] = node ? node.json_values : nil
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
musicxml-0.0.1 lib/musicxml/node/json_export.rb