Sha256: 455ee3c2a815f6714a8418c72570ae66f056645a833fd5f26b8e4c33fb709b22

Contents?: true

Size: 1.47 KB

Versions: 1

Compression:

Stored size: 1.47 KB

Contents

# frozen_string_literal: true

module Protobuf3Fixer
  class Reflector
    TYPE_PLAIN      = :plain
    TYPE_ARRAY      = :array
    TYPE_MAP        = :map
    TYPE_SUB_OBJECT = :subobject

    attr_accessor :klass, :instance, :field_info, :field_names
    def initialize(klass)
      self.klass = klass
      reflect!
    end

    def reflect!
      self.field_info = {}
      self.field_names = Set.new

      self.instance = klass.new
      klass.descriptor.each(&method(:reflect_on_field))
    end

    def field_type(field_name)
      field_info[field_name][:type] if field_info[field_name]
    end

    def subklass_for(field_name)
      field_info[field_name] && field_info[field_name][:klass]
    end

    def reflect_on_field(desc)
      type = if desc.type == :message
               determine_complex_type(instance.public_send(desc.name))
             else
               TYPE_PLAIN
             end

      field_names << desc.name
      field_info[desc.name] = {
        klass: divine_type(type, desc),
        type: type,
      }
    end

    def divine_type(type, descriptor)
      case type
      when TYPE_MAP
        descriptor.subtype.to_a[1].subtype&.msgclass
      when TYPE_ARRAY, TYPE_SUB_OBJECT
        descriptor.subtype&.msgclass
      end
    end

    def determine_complex_type(result)
      case result
      when Google::Protobuf::RepeatedField
        TYPE_ARRAY
      when Google::Protobuf::Map
        TYPE_MAP
      else
        TYPE_SUB_OBJECT
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hermes_messenger_of_the_gods-2.0.0 vendor/cache/Protobuf3Fixer-5f9f1a2d2da9/lib/protobuf3_fixer/reflector.rb