Class: GuessStruct

Inherits:
Object
  • Object
show all
Defined in:
lib/guess_struct.rb,
lib/guess_struct/version.rb

Constant Summary collapse

GuessError =
Class.new(StandardError)
VERSION =
"0.0.1"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**arg) ⇒ GuessStruct

Returns a new instance of GuessStruct.



5
6
7
8
9
10
11
12
13
# File 'lib/guess_struct.rb', line 5

def initialize(**arg)
  sym_arg = {}
  arg.each do |k, v|
    sym_arg[k.to_sym] = v
  end
  self.class.members.each do |k|
    self[k] = sym_arg[k]
  end
end

Class Method Details

.clearObject



56
57
58
59
60
61
# File 'lib/guess_struct.rb', line 56

def clear
  d = definition
  d.each_key do |k|
    d[k] = nil
  end
end

.definitionObject



48
49
50
# File 'lib/guess_struct.rb', line 48

def definition
  const_get(:DEFINITION)
end

.membersObject



52
53
54
# File 'lib/guess_struct.rb', line 52

def members
  const_get(:MEMBERS)
end

.new(*args, &block) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/guess_struct.rb', line 64

def new(*args, &block)
  c = Class.new(GuessStruct) do
    const_set :MEMBERS, args
    const_set :DEFINITION, Hash[members.map { |i| [i, nil] }]

    class << self
      alias_method :new, :original_new
    end

    args.each do |k|
      define_method(k) do
        instance_variable_get("@#{k}")
      end

      define_method("#{k}=") do |v|
        unless valid?(k, v)
          raise GuessError, "#{self.class}##{k} expect #{self.class.definition.fetch(k)} got #{v.inspect}"
        end
        self.class.definition[k] = v.class if !v.nil?
        instance_variable_set("@#{k}", v)
      end
    end
  end
  if block_given?
    c.module_eval(&block)
  end
  c
end

.original_newObject



63
# File 'lib/guess_struct.rb', line 63

alias original_new new

Instance Method Details

#[](key) ⇒ Object



23
24
25
# File 'lib/guess_struct.rb', line 23

def [](key)
  __send__ key
end

#[]=(key, value) ⇒ Object



27
28
29
# File 'lib/guess_struct.rb', line 27

def []=(key, value)
  __send__ "#{key}=", value
end

#inspectObject Also known as: to_s



31
32
33
34
35
36
# File 'lib/guess_struct.rb', line 31

def inspect
  m = to_h.map do |k, v|
    "#{k}=#{v.inspect}"
  end
  "#<#{self.class} #{m.join(', ')}>"
end

#to_hObject



39
40
41
42
43
44
45
# File 'lib/guess_struct.rb', line 39

def to_h
  m = {}
  self.class.members.each do |k|
    m[k] = self[k]
  end
  m
end

#valid?(key, value) ⇒ Boolean

Returns:

  • (Boolean)


15
16
17
18
19
20
21
# File 'lib/guess_struct.rb', line 15

def valid?(key, value)
  t = self.class.definition[key]
  return true if t.nil?
  return true if value.nil?
  return true if t === value
  false
end