class Mail::FieldList

Field List class provides an enhanced array that keeps a list of email fields in order. And allows you to insert new fields without having to worry about the order they will appear in.

Public Instance Methods

<<(field)
Alias for: add_field
add_field(field) click to toggle source
# File lib/mail/field_list.rb, line 22
def add_field(field)
  if field.singular?
    replace_field field
  else
    insert_field field
  end
end
Also aliased as: <<
delete_field(name) click to toggle source
# File lib/mail/field_list.rb, line 60
def delete_field(name)
  delete_if { |f| f.responsible_for? name }
end
get_field(field_name) click to toggle source
# File lib/mail/field_list.rb, line 13
def get_field(field_name)
  fields = select_fields(field_name)
  case fields.size
  when 0; nil
  when 1; fields.first
  else fields
  end
end
has_field?(field_name) click to toggle source
# File lib/mail/field_list.rb, line 9
def has_field?(field_name)
  any? { |f| f.responsible_for? field_name }
end
insert_field(field) click to toggle source

Insert the field in sorted order.

Heavily based on bisect.insort from Python, which is:

Copyright (C) 2001-2013 Python Software Foundation.
Licensed under <http://docs.python.org/license.html>
From <http://hg.python.org/cpython/file/2.7/Lib/bisect.py>
# File lib/mail/field_list.rb, line 46
def insert_field(field)
  lo, hi = 0, size
  while lo < hi
    mid = (lo + hi).div(2)
    if field < self[mid]
      hi = mid
    else
      lo = mid + 1
    end
  end

  insert lo, field
end
replace_field(field) click to toggle source
# File lib/mail/field_list.rb, line 31
def replace_field(field)
  if first_offset = index { |f| f.responsible_for? field.name }
    delete_field field.name
    insert first_offset, field
  else
    insert_field field
  end
end
summary() click to toggle source
# File lib/mail/field_list.rb, line 64
def summary
  map { |f| "<#{f.name}: #{f.value}>" }.join(", ")
end

Private Instance Methods

select_fields(field_name) click to toggle source
# File lib/mail/field_list.rb, line 70
def select_fields(field_name)
  fields = select { |f| f.responsible_for? field_name }
  if fields.size > 1 && singular?(field_name)
    Array(fields.detect { |f| f.errors.size == 0 } || fields.first)
  else
    fields
  end
end
singular?(field_name) click to toggle source
# File lib/mail/field_list.rb, line 79
def singular?(field_name)
  if klass = Mail::Field.field_class_for(field_name)
    klass.singular?
  else
    false
  end
end