Sha256: ae8d8ae3633db511c7fd933dd56897aa1eb0722511a169728a40ca851399f7fd

Contents?: true

Size: 1.23 KB

Versions: 1

Compression:

Stored size: 1.23 KB

Contents

# frozen_string_literal: true

class Micro::Struct::Creator
  module CreateStruct
    extend self

    def with(required_members, optional_members, features, &block)
      struct = ::Struct.new(*(required_members + optional_members), &block)
      struct.send(:private_class_method, :new)

      def_to_ary(struct) if features[:to_ary]
      def_to_hash(struct) if features[:to_hash]
      def_readonly(struct) if features[:readonly]
      def_instance_copy(struct) if features[:instance_copy]

      struct
    end

    private

      def def_to_ary(struct)
        struct.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
          def to_ary
            to_a
          end
        RUBY
      end

      def def_to_hash(struct)
        struct.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
          def to_hash
            to_h
          end
        RUBY
      end

      def def_readonly(struct)
        struct.send(:private, *struct.members.map { |member| "#{member}=" })
      end

      def def_instance_copy(struct)
        struct.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
          def with(**members)
            self.class.const_get(:Container, false).new(**to_h.merge(members))
          end
        RUBY
      end
  end

  private_constant :CreateStruct
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
u-struct-0.9.0 lib/micro/struct/creator/create_struct.rb