truemail-rb/truemail-ruby-client

View on GitHub
lib/truemail/client/configuration.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module Truemail
  module Client
    class Configuration
      DEFAULT_PORT = 9292

      Error = ::Class.new(::StandardError)
      ArgumentError = ::Class.new(::StandardError) do
        def initialize(arg_value, arg_name)
          super("#{arg_value} is not a valid #{arg_name[0..-2]}")
        end
      end

      attr_reader :host, :port, :token
      attr_accessor :secure_connection

      def initialize(&block)
        @secure_connection = false
        @port = Truemail::Client::Configuration::DEFAULT_PORT
        tap(&block) if block
      end

      %i[host port token].each do |method|
        define_method(:"#{method}=") do |argument|
          raise_unless(
            argument,
            __method__,
            method.eql?(:port) ? argument.is_a?(::Integer) && argument.positive? : argument.is_a?(::String)
          )
          instance_variable_set(:"@#{method}", argument)
        end
      end

      def complete?
        !!host && !!token
      end

      private

      def raise_unless(argument_context, argument_name, condition)
        raise Truemail::Client::Configuration::ArgumentError.new(argument_context, argument_name) unless condition
      end
    end
  end
end