Class: Xunch::HashCodec

Inherits:
Codec
  • Object
show all
Defined in:
lib/xunch/codec/hash_codec.rb

Constant Summary

Constants inherited from Codec

Codec::DEFAULT_DATE_FORMAT, Codec::DEFAULT_TYPE_MAP

Instance Method Summary collapse

Constructor Details

#initialize(klass, fields) ⇒ HashCodec

Returns a new instance of HashCodec.



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/xunch/codec/hash_codec.rb', line 4

def initialize(klass,fields)
  super(klass)
  temp_set_methods = {}
  temp_get_methods = {}
  @fields = fields
  @fields.each{ |field|
    temp_get_method = @get_methods[field]
    temp_set_method = @set_methods[field]
    if temp_set_method == nil || temp_get_method == nil
      raise XunchConfigError.new("field #{field} doesn't have set or get method")
    end
    temp_get_methods[field] = temp_get_method
    temp_set_methods[field] = temp_set_method
  }
  @set_methods = temp_set_methods
  @get_methods = temp_get_methods
end

Instance Method Details

#decode(hash) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/xunch/codec/hash_codec.rb', line 45

def decode(hash)
  value = @klass.new
  count = 0
  hash.each { |k, v|
    if v == nil
      count+=1
    else
      value.send(@set_methods[k],v)
    end
  }
  if count == hash.length
    return nil
  else
    return value
  end
end

#decode_fields(hash, fields) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/xunch/codec/hash_codec.rb', line 81

def decode_fields(hash,fields)
  value = @klass.new
  count = 0
  fields.each { |field|
    v = hash[field]
    if v == nil
      count+=1
    else
      value.send(@set_methods[field],v)
    end
  }
  if count == hash.length
    return nil
  else
    return value
  end
end

#encode(value) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/xunch/codec/hash_codec.rb', line 22

def encode(value)
  unless value.class.name.start_with? @klass.name
    raise XunchCodecError.new("Codec error. Codec class is #{@klass}," <<
      "object_id is #{@klass.object_id}, but value class is #{value.class}," <<
      "object_id is #{value.class.object_id}.
      value class = #{value.class.inspect} vs config class = #{@klass.inspect} ")
  end
  hash = Hash.new
  @get_methods.each do | k , v |
    if value.has_attribute?(v)
      var_value = value.send(v)
      if var_value != nil
        if var_value.class.name == Time.name or var_value.class.name == DateTime.name
          hash[k] = var_value.strftime(DEFAULT_DATE_FORMAT)
        else
          hash[k] = var_value
        end
      end
    end
  end
  return hash
end

#encode_fields(value, fields) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/xunch/codec/hash_codec.rb', line 62

def encode_fields(value,fields)
  hash = Hash.new
  fields.each { |field|
    get_method = @get_methods[field]
    if get_method == nil
      raise XunchCodecError.new("Undefined field #{field}")
    end
    var_value = value.send(get_method)
    if var_value != nil
      if var_value.class.name == Time.name or var_value.class.name == DateTime.name
        hash[field] = var_value.strftime(DEFAULT_DATE_FORMAT)
      else
        hash[field] = var_value
      end
    end
  }
  return hash
end