Sha256: 1bb07778b8955a8edd701cf5a7e4364714a3ba555b140b4c1810f1024fa9ee75

Contents?: true

Size: 1.47 KB

Versions: 3

Compression:

Stored size: 1.47 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 = value[:alias] || key
          [key.to_s, 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.6 lib/paradocs/extensions/payload_builder.rb
paradocs-1.1.5 lib/paradocs/extensions/payload_builder.rb
paradocs-1.1.4 lib/paradocs/extensions/payload_builder.rb