Module: Outbox::MessageFields::ClassMethods

Defined in:
lib/outbox/message_fields.rb

Instance Method Summary collapse

Instance Method Details

#defaults(defaults = nil) ⇒ Object

Sets default values for defined fields.

Email.defaults from: '[email protected]'
message = Email.new
message.from #=> '[email protected]'


13
14
15
16
17
18
19
20
21
# File 'lib/outbox/message_fields.rb', line 13

def defaults(defaults = nil)
  @defaults ||= {}

  if defaults.nil?
    @defaults
  else
    @defaults.merge!(defaults)
  end
end

#field(name, options = {}) ⇒ Object

Defines a ‘field’ which is a point of data for this type of data. Optionally you can set it to be required, or wether or not you want accessors defined for you. If you define your own accessors, make sure the reader also accepts a value that can be set, so it’ll work with the block definition.

class SomeMessageType < Outbox::Messages::base
  field :to, required: true
  field :body, accessor: false

  def body(value = nil)
    value ? self.body = value : @body
  end

  def body=(value)
    @body = parse_body(value)
  end
end

message = SomeMessageType.new do
  to 'Bob'
end
message.to #=> 'Bob'
message.to = 'John'
message.to #=> 'John'
message.to = nil
message.validate_fields #=> raises Outbox::MissingRequiredFieldError


84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/outbox/message_fields.rb', line 84

def field(name, options = {})
  name = name.to_sym
  options = Outbox::Accessor.new(options)

  fields.push(name)
  required_fields.push(name) if options[:required]

  unless options[:accessor] == false
    define_field_reader(name) unless options[:reader] == false
    define_field_writer(name) unless options[:writer] == false
  end
end

#fields(*names) ⇒ Object

Returns the defined fields for this message type.

class SomeMessageType < Outbox::Messages::Base
  field :to
  field :from
end

SomeMessageType.fields #=> [:to, :from]

Also allows you to define multiple fields at once.

class SomeMessageType < Outbox::Messages::Base
  fields :to, :from, required: true
end

message = SomeMessageType.new do
  to 'Bob'
  from 'John'
end
message.to #=> 'Bob'
message.from #=> 'John'
message.from = nil
message.validate_fields #=> raises Outbox::MissingRequiredFieldError


46
47
48
49
50
51
52
53
54
55
# File 'lib/outbox/message_fields.rb', line 46

def fields(*names)
  if names.empty?
    @fields ||= []
  else
    options = names.last.is_a?(Hash) ? names.pop : {}
    names.flatten.each do |name|
      field(name, options)
    end
  end
end

#required_fields(*names) ⇒ Object Also known as: required_field

Returns an array of the required fields for a message type.

class SomeMessageType < Outbox::Messages::Base
  field :to, required: true
  fields :from, :subject
end
SomeMessageType.required_fields #=> [:to]

Also can be used an alias for defining fields that are required.

class SomeMessageType < Outbox::Messages::Base
  required_fields :to, :from
end
SomeMessageType.required_fields #=> [:to, :from]


111
112
113
114
115
116
117
118
119
120
# File 'lib/outbox/message_fields.rb', line 111

def required_fields(*names)
  if names.empty?
    @required_fields ||= []
  else
    options = names.last.is_a?(Hash) ? names.pop : {}
    options[:required] = true
    names << options
    fields(*names)
  end
end