Sha256: 0579790a932b92e43e997ffef016f5448327aaeedb01e0d670e77dbc8647a863

Contents?: true

Size: 1.26 KB

Versions: 3

Compression:

Stored size: 1.26 KB

Contents

require 'delegate'
require 'protobuf/descriptor/enum_descriptor'
require 'protobuf/message/protoable'

module Protobuf
  class Enum
    class << self
      include Protoable

      attr_reader :values

      def name_by_value(value)
        if not defined?(@values)
          constants.find {|c| const_get(c) == value}  # for compatibility
        else
          @values_index ||= @values.inject({}) {|hash, (n, v)| hash[v.value] = n; hash }
          @values_index[value]
        end
      end

      alias get_name_by_tag name_by_value

      def valid_tag?(tag)
        !! name_by_value(tag)
      end

      def descriptor
        @descriptor ||= Descriptor::EnumDescriptor.new(self)
      end

      private

      def define(name, value)
        enum_value = EnumValue.new(self, name, value)
        const_set(name, enum_value)
        @values ||= {}
        @values[name] = enum_value
      end
    end
  end

  class EnumValue < SimpleDelegator

    attr_reader :parent_class, :name, :value

    def initialize(parent_class, name, value)
      @parent_class = parent_class
      @name = name
      @value = value
      super(@value)
    end

    def to_s
      @name.to_s
    end

    def inspect
      "\#<#{self.class} #{@parent_class}::#{@name}=#{@value}>"
    end
  end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
protobuf-1.4.2 lib/protobuf/message/enum.rb
protobuf-1.4.1 lib/protobuf/message/enum.rb
protobuf-1.4.0 lib/protobuf/message/enum.rb