# encoding: utf-8 module Mongoid module Config module Validators # Validator for client specific configuration. module Client extend self # Standard configuration options. # # @since 3.0.0 STANDARD = [ :database, :hosts, :username, :password ].freeze # Validate the client configuration. # # @example Validate the client config. # Client.validate({ default: { hosts: [ "localhost:27017" ] }}) # # @param [ Hash ] clients The clients config. # # @since 3.0.0 def validate(clients) unless clients.has_key?(:default) raise Errors::NoDefaultClient.new(clients.keys) end clients.each_pair do |name, config| validate_client_database(name, config) validate_client_hosts(name, config) validate_client_uri(name, config) end end private # Validate that the client config has database. # # @api private # # @example Validate the client has database. # validator.validate_client_database(:default, {}) # # @param [ String, Symbol ] name The config key. # @param [ Hash ] config The configuration. # # @since 3.0.0 def validate_client_database(name, config) if no_database_or_uri?(config) raise Errors::NoClientDatabase.new(name, config) end end # Validate that the client config has hosts. # # @api private # # @example Validate the client has hosts. # validator.validate_client_hosts(:default, {}) # # @param [ String, Symbol ] name The config key. # @param [ Hash ] config The configuration. # # @since 3.0.0 def validate_client_hosts(name, config) if no_hosts_or_uri?(config) raise Errors::NoClientHosts.new(name, config) end end # Validate that not both a uri and standard options are provided for a # single client. # # @api private # # @example Validate the uri and options. # validator.validate_client_uri(:default, {}) # # @param [ String, Symbol ] name The config key. # @param [ Hash ] config The configuration. # # @since 3.0.0 def validate_client_uri(name, config) if both_uri_and_standard?(config) raise Errors::MixedClientConfiguration.new(name, config) end end # Return true if the configuration has no database or uri option # defined. # # @api private # # @example Validate the options. # validator.no_database_or_uri?(config) # # @param [ Hash ] config The configuration options. # # @return [ true, false ] If no database or uri is defined. # # @since 3.0.0 def no_database_or_uri?(config) !config.has_key?(:database) && !config.has_key?(:uri) end # Return true if the configuration has no hosts or uri option # defined. # # @api private # # @example Validate the options. # validator.no_hosts_or_uri?(config) # # @param [ Hash ] config The configuration options. # # @return [ true, false ] If no hosts or uri is defined. # # @since 3.0.0 def no_hosts_or_uri?(config) !config.has_key?(:hosts) && !config.has_key?(:uri) end # Return true if the configuration has both standard options and a uri # defined. # # @api private # # @example Validate the options. # validator.no_database_or_uri?(config) # # @param [ Hash ] config The configuration options. # # @return [ true, false ] If both standard and uri are defined. # # @since 3.0.0 def both_uri_and_standard?(config) config.has_key?(:uri) && config.keys.any? do |key| STANDARD.include?(key.to_sym) end end end end end end