Sha256: 3574bb69c6e57d244ed194c88bac300c81b4d21c6fc8362b49b0c17f51c4400c

Contents?: true

Size: 1.33 KB

Versions: 2

Compression:

Stored size: 1.33 KB

Contents

module Finitio
  #
  # Helper class for tuple and relation attributes.
  #
  # An attribute is simply a `(name: AttrName, type: Type)` pair, where the
  # type is a Finitio type.
  #
  class Attribute

    def initialize(name, type)
      unless name.is_a?(Symbol)
        raise ArgumentError, "Symbol expected for attribute name, got `#{name}`"
      end

      unless type.is_a?(Type)
        raise ArgumentError, "Type expected for attribute domain, got `#{type}`"
      end

      @name, @type = name, type
    end
    attr_reader :name, :type

    # Fetch the attribute on `arg`, which is expected to be a Hash object.
    #
    # This method allows working with ruby hashes having either Symbols or
    # Strings as keys. It ensures that no Symbol is created by the rest of the
    # code, since this would provide a DoS attack vector under MRI.
    #
    def fetch_on(arg, &bl)
      unless arg.respond_to?(:fetch)
        raise ArgumentError, "Object responding to `fetch` expected"
      end
      arg.fetch(name) do
        arg.fetch(name.to_s, &bl)
      end
    end

    def to_name
      "#{name}: #{type}"
    end

    def ==(other)
      return nil unless other.is_a?(Attribute)
      name==other.name and type==other.type
    end
    alias :eql? :==

    def hash
      name.hash ^ type.hash
    end

  end # class Attribute
end # module Finitio

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
finitio-0.4.1 lib/finitio/support/attribute.rb
finitio-0.4.0 lib/finitio/support/attribute.rb