Sha256: 2c310ed88d4d25bd1ac95dc57d7a0a0df9f26baf26e000f52013c56a50398e01

Contents?: true

Size: 1.45 KB

Versions: 18

Compression:

Stored size: 1.45 KB

Contents

module SoberSwag
  module Serializer
    ##
    # Extract out a hash from a list of
    # name/serializer pairs.
    class FieldList < Base
      def initialize(field_list)
        @field_list = field_list
      end

      attr_reader :field_list

      ##
      # Alias to make writing primitive stuff much easier
      def primitive(symbol)
        SoberSwag::Serializer.Primitive(SoberSwag::Types.const_get(symbol))
      end

      def serialize(object, options = {})
        field_list.map { |field|
          [field.name, field.serializer.serialize(object, options)]
        }.to_h
      end

      def type
        @type ||= make_struct_type!
      end

      def lazy_type?
        true
      end

      def lazy_type
        struct_class
      end

      def finalize_lazy_type!
        make_struct_type!
      end

      private

      def make_struct_type! # rubocop:disable Metrics/MethodLength
        # mutual recursion makes this really, really annoying.
        return struct_class if @made_struct_type

        f = field_list
        s = identifier
        struct_class.instance_eval do
          identifier(s)
          f.each do |field|
            attribute field.name, field.serializer.lazy_type
          end
        end
        @made_struct_type = true

        field_list.map(&:serializer).each(&:finalize_lazy_type!)

        struct_class
      end

      def struct_class
        @struct_class ||= Class.new(SoberSwag::InputObject)
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
sober_swag-0.19.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.18.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.17.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.16.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.15.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.14.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.13.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.12.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.11.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.10.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.9.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.8.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.7.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.6.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.5.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.4.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.3.0 lib/sober_swag/serializer/field_list.rb
sober_swag-0.2.0 lib/sober_swag/serializer/field_list.rb