Module: LIS::Message::ClassMethods
- Included in:
- Base
- Defined in:
- lib/lis/messages.rb
Overview
declarative definition of message structure
Constant Summary collapse
- 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
- #default_fields ⇒ Object
- #field_count(val = nil) ⇒ Object
- #get_field_attributes(index) ⇒ Object
- #get_index_for(field_name) ⇒ Object
-
#has_field(idx, name = nil, opts = {}) ⇒ Object
define a field of a message at a specific index and an optional type.
- #set_field_attributes(index, hash) ⇒ Object
- #set_index_for(field_name, idx) ⇒ Object
-
#type_id(char = nil) ⇒ Object
registers a message with a specific type prefix to make Base.from_string work.
Instance Method Details
#default_fields ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/lis/messages.rb', line 21 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 |
#field_count(val = nil) ⇒ Object
16 17 18 19 |
# File 'lib/lis/messages.rb', line 16 def field_count(val = nil) @field_count = val if val @field_count end |
#get_field_attributes(index) ⇒ Object
79 80 81 82 83 84 |
# File 'lib/lis/messages.rb', line 79 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 |
#get_index_for(field_name) ⇒ Object
73 74 75 76 77 |
# File 'lib/lis/messages.rb', line 73 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 |
#has_field(idx, name = nil, opts = {}) ⇒ Object
define a field of a message at a specific index and an optional type
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/lis/messages.rb', line 35 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 |
#set_field_attributes(index, hash) ⇒ Object
86 87 88 89 |
# File 'lib/lis/messages.rb', line 86 def set_field_attributes(index, hash) @field_names ||= {} @field_names[index] = hash end |
#set_index_for(field_name, idx) ⇒ Object
68 69 70 71 |
# File 'lib/lis/messages.rb', line 68 def set_index_for(field_name, idx) @field_indices ||= {} @field_indices[field_name] = idx end |
#type_id(char = nil) ⇒ Object
registers a message with a specific type prefix to make Base.from_string work
62 63 64 65 66 |
# File 'lib/lis/messages.rb', line 62 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 |