Class: Hamsterdam::Struct

Inherits:
Object
  • Object
show all
Defined in:
lib/hamsterdam.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(values = Hamsterdam.hash, validate = true) ⇒ Struct

Returns a new instance of Struct.



116
117
118
119
120
121
122
123
# File 'lib/hamsterdam.rb', line 116

def initialize(values=Hamsterdam.hash, validate=true)
  if validate
    @data = flesh_out(ensure_expected_hash(values))
    validate_keys(@data)
  else
    @data = values
  end
end

Class Method Details

.define(*field_names) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/hamsterdam.rb', line 77

def self.define(*field_names)
  struct_class = Class.new(Hamsterdam::Struct) do
    field_names = field_names.map &:to_sym
    field_names.each do |fname|
      define_method fname do 
        @data[fname]
      end

      define_method "set_#{fname}" do |value|
        if @data[fname] == value
          self
        else
          self.class.new(@data.put(fname, value), false)
        end
      end
    end
  end

  struct_class.instance_variable_set(:@field_names, Hamsterdam.set(*field_names))
  struct_class.instance_variable_set(:@field_names_list, Hamsterdam.list(*field_names))
  class << struct_class 
    def field_names
      if !@field_names.nil?
        @field_names
      else
        superclass.field_names
      end
    end
    def field_names_list
      if !@field_names_list.nil?
        @field_names_list
      else
        superclass.field_names_list
      end
    end
  end
  struct_class
end

.safe_create(values = Hamsterdam.hash) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/hamsterdam.rb', line 125

def self.safe_create(values=Hamsterdam.hash)
  h = field_names.inject(Hamsterdam.hash) do |memo, field_name|
    if values.has_key?(field_name)
      memo.put(field_name, values[field_name])
    elsif values.has_key?(field_name.to_s)
      memo.put(field_name.to_s, values[field_name.to_s])
    else
      memo
    end
  end
  new(h)
end

Instance Method Details

#==(other) ⇒ Object



142
143
144
145
146
# File 'lib/hamsterdam.rb', line 142

def ==(other)
  !other.nil? &&
    other.respond_to?(:internal_hash) &&
    internal_hash == other.internal_hash
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


148
149
150
# File 'lib/hamsterdam.rb', line 148

def eql?(other)
  self.class == other.class && self == other
end

#hashObject



152
153
154
# File 'lib/hamsterdam.rb', line 152

def hash
  @data.hash
end

#inspectObject



161
162
163
# File 'lib/hamsterdam.rb', line 161

def inspect
  to_s
end

#internal_hashObject Also known as: to_hamster_hash



156
157
158
# File 'lib/hamsterdam.rb', line 156

def internal_hash
  @data
end

#merge(values) ⇒ Object



138
139
140
# File 'lib/hamsterdam.rb', line 138

def merge(values)
  self.class.new(@data.merge(ensure_expected_hash(values)))
end

#to_sObject



165
166
167
168
169
170
# File 'lib/hamsterdam.rb', line 165

def to_s
  name = self.class.name ? self.class.name.split(/::/).last : self.class.to_s
  data = internal_hash
  fields = self.class.field_names_list.map { |fname| "#{fname}: #{data[fname].inspect}" }
  "<#{([name]+fields).join(" ")}>"
end