Class: Natsy::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/natsy/config.rb

Overview

Represents the configuration options for Natsy. Configuration options are set using the ‘Natsy::Config::set` method, either as arguments or by using the appropriate setters on the object passed to the block.

Defined Under Namespace

Classes: Options

Constant Summary collapse

VALID_OPTIONS =

Valid option keys that can be given to Natsy::Config::set, either in a Hash passed to the method, keyword arguments passed to the method, or by using setters on the Natsy::Config::Options object passed to the block.

i[
  url
  urls
  logger
  default_queue
].freeze
DEFAULT_URL =

The default NATS server URL (used if none is configured)

"nats://localhost:4222"

Class Method Summary collapse

Class Method Details

.as_json(*_args) ⇒ Object

Alias for to_h.



230
231
232
# File 'lib/natsy/config.rb', line 230

def as_json(*_args)
  to_h
end

.default_queueObject

The default queue that natsy should use for subscriptions.

See also: Natsy::Config::Options#default_queue=



216
217
218
# File 'lib/natsy/config.rb', line 216

def default_queue
  Utils.presence(given_options[:default_queue])
end

.loggerObject

The logger that natsy should use to write out logs for messages received, responses sent, errors raised, lifecycle events, etc.

See also: Natsy::Config::Options#logger=



208
209
210
# File 'lib/natsy/config.rb', line 208

def logger
  Utils.presence(given_options[:logger])
end

.reset!Object

Reset the configuration to default values.



240
241
242
# File 'lib/natsy/config.rb', line 240

def reset!
  @given_options = nil
end

.set(keyword_options = {}) {|new_block_options_object| ... } ⇒ Object

Specify configuration options, either by providing them as keyword arguments or by using a block. Should you choose to set options using a block, it will be passed a single argument (an instance of Natsy::Config::Options). You can set any options on the instance that you see fit.

NOTE: The following two examples do exactly the same thing.

Examples:

Natsy::Config.set(
  urls: ["nats://foo.bar:4567", "nats://foo.bar:5678"],
  default_queue: "foobar",
  logger: Rails.logger,
)
Natsy::Config.set do |options|
  options.urls = ["nats://foo.bar:4567", "nats://foo.bar:5678"]
  options.default_queue = "foobar"
  options.logger = Rails.logger
end

Yields:

  • (new_block_options_object)


166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/natsy/config.rb', line 166

def set(keyword_options = {})
  new_hash_options = (keyword_options || {}).transform_keys(&:to_sym)

  invalid_config = lambda do |detail, keys|
    raise InvalidConfigError, "Invalid options provided #{detail}: #{keys.join(', ')}"
  end

  invalid_keys = invalid_option_keys(new_hash_options)
  invalid_config.call("as arguments", invalid_keys) if invalid_keys.any?

  # Want to take advantage of the setters on +Natsy::Config::Options+...
  new_hash_options_object = new_hash_options.each_with_object(Options.new) do |(key, value), options|
    options.send(:"#{key}=", value)
  end

  given_options.merge!(new_hash_options_object.to_h)

  new_block_options_object = Options.new
  yield(new_block_options_object) if block_given?

  invalid_keys = invalid_option_keys(new_block_options_object)
  invalid_config.call("in block", invalid_keys) if invalid_keys.any?

  given_options.merge!(new_block_options_object.to_h)
end

.to_hObject

Returns all config options as a Hash.



221
222
223
224
225
226
227
# File 'lib/natsy/config.rb', line 221

def to_h
  {
    urls: urls,
    logger: logger,
    default_queue: default_queue,
  }
end

.to_json(*_args) ⇒ Object

Serialize the configuration into a JSON object string.



235
236
237
# File 'lib/natsy/config.rb', line 235

def to_json(*_args)
  to_h.to_json
end

.urlsObject

The NATS server URLs that natsy should listen on.

See also: Natsy::Config::Options#urls=



196
197
198
199
200
201
# File 'lib/natsy/config.rb', line 196

def urls
  given_url_list = [given_options[:url]].flatten
  given_urls_list = [given_options[:urls]].flatten
  all_given_urls = [*given_url_list, *given_urls_list].compact.uniq
  Utils.presence(all_given_urls) || [DEFAULT_URL]
end