Sha256: 3808ff7c1f7acd9d85c8a32cc47d1df63b66fcb5b2cf65d2bda6709f8b622cd7

Contents?: true

Size: 1.42 KB

Versions: 3

Compression:

Stored size: 1.42 KB

Contents

module Paradocs
  module Extensions
    class PayloadBuilder
      attr_reader :structure, :result
      attr_accessor :skip_word
      def initialize(schema, skip_word: :skip)
        @structure  = schema.structure
        @skip_word  = skip_word
      end

      def build!(sort_by_schema: false, &block)
        result = structure.all_nested.map { |name, struct| [name, build_simple_structure(struct, &block)] }.to_h
        sort_by_schema ? schema.resolve(result).output : result
      end

      private

      def build_simple_structure(struct, &block)
        struct.map do |key, value|
          key = key.to_s
          next if key.start_with?(Paradocs.config.meta_prefix) # skip all the meta fields
          ex_value = restore_one(key, value, &block)
          next if ex_value == @skip_word
          [key, ex_value]
        end.compact.to_h
      end

      def restore_one(key, value, &block)
        default = value[:default]
        ex_value = if value[:structure]
          data = build_simple_structure(value[:structure], &block)
          value[:type] == :array ? [data] : data
        elsif default
          default.is_a?(Proc) ? default.call : default
        elsif value[:options] && !value[:options].empty?
          options = value[:options]
          value[:type] == :array ? options : options.sample
        end
        return ex_value unless block_given?
        yield(key, value, ex_value, @skip_word)
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
paradocs-1.1.3 lib/paradocs/extensions/payload_builder.rb
paradocs-1.1.2 lib/paradocs/extensions/payload_builder.rb
paradocs-1.1.1 lib/paradocs/extensions/payload_builder.rb