Module: LIS::Message::ClassMethods

Included in:
Base
Defined in:
lib/lis/messages.rb

Overview

declarative definition of message structure

Constant Summary

CONVERSION_WRITER =
{
  :string => lambda { |s| s },
  :int => lambda { |s| s.to_i },
  :timestamp => lambda { |s| DateTime.strptime(s, "%Y%m%d%H%M%S") rescue nil }
}

Instance Method Summary (collapse)

Instance Method Details

- (Object) default_fields



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/lis/messages.rb', line 19

def default_fields
  arr = Array.new(@field_count)
  (0 .. @field_count).inject(arr) do |a,i|
    default = (get_field_attributes(i) || {})[:default]
    if default
      default = default.call if default.respond_to?(:call)
      a[i-1] = default
    end
    arr
  end
end

- (Object) field_count(val = nil)



14
15
16
17
# File 'lib/lis/messages.rb', line 14

def field_count(val = nil)
  @field_count = val if val
  @field_count
end

- (Object) get_field_attributes(index)



77
78
79
80
81
82
# File 'lib/lis/messages.rb', line 77

def get_field_attributes(index)
  @field_names ||= {}
  val = (@field_names || {})[index]
  val ||= superclass.get_field_attributes(index) if superclass.respond_to?(:get_field_attributes)
  val
end

- (Object) get_index_for(field_name)



71
72
73
74
75
# File 'lib/lis/messages.rb', line 71

def get_index_for(field_name)
  val = @field_index[field_name]
  val ||= superclass.get_index_for(field_name) if superclass.respond_to?(:get_index_for)
  val
end

- (Object) has_field(idx, name = nil, opts = {})

define a field of a message at a specific index and an optional type



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/lis/messages.rb', line 33

def has_field(idx, name = nil, opts={})
  set_index_for(name, idx) if name
  set_field_attributes(idx, { :name => name,
                              :type => opts[:type] || :string,
                              :default => opts[:default]})

  @field_count ||= 0
  @field_count = [@field_count, idx].max

  return unless name

  define_method :#{name}=" do |val|
    @fields ||= {}
    @fields[idx] = val
  end

  define_method :#{name}" do
    field_attrs = self.class.get_field_attributes(idx)
    val = (@fields || {})[idx]
    converter = CONVERSION_WRITER[field_attrs[:type]] if field_attrs
    val = converter.call(val) if converter
    val
  end
end

- (Object) set_field_attributes(index, hash)



84
85
86
87
# File 'lib/lis/messages.rb', line 84

def set_field_attributes(index, hash)
  @field_names ||= {}
  @field_names[index] = hash
end

- (Object) set_index_for(field_name, idx)



66
67
68
69
# File 'lib/lis/messages.rb', line 66

def set_index_for(field_name, idx)
  @field_indices ||= {}
  @field_indices[field_name] = idx
end

- (Object) type_id(char = nil)

registers a message with a specific type prefix to make Base.from_string work



60
61
62
63
64
# File 'lib/lis/messages.rb', line 60

def type_id(char = nil)
  return @@messages_by_type.find {|c,klass| klass == self }.first unless char
  @@messages_by_type ||= {}
  @@messages_by_type[char] = self
end