class SmartCore::Validator::Invoker

@api private @since 0.1.0

Constants

Error

@return [SmartCore::Validator::Invoker::Error]

@api private @since 0.4.0

StopValidationError

@return [SmartCore::Validator::Invoker::StopValidationError]

@api private @since 0.4.0

Attributes

validator[R]

@return [SmartCore::Validator]

@api private @since 0.1.0k

Public Class Methods

call(validator, validating_method) click to toggle source

@param validator [SmartCore::Validator] @param validating_method [Symbol, String] @return [SmartCore::Validator::ErrorSet]

@api private @since 0.1.0

# File lib/smart_core/validator/invoker.rb, line 26
def call(validator, validating_method)
  new(validator).call(validating_method)
end
new(validator) click to toggle source

@param validator [SmartCore::Validator] @return [void]

@api private @since 0.1.0

# File lib/smart_core/validator/invoker.rb, line 42
def initialize(validator)
  @validator = validator
  @access_lock = Mutex.new
end

Public Instance Methods

call(validating_method) click to toggle source

@param validating_method [String, Symbol] @return [SmartCore::Validator::ErrorSet]

@api private @since 0.1.0

# File lib/smart_core/validator/invoker.rb, line 53
def call(validating_method)
  thread_safe do
    ErrorSet.new.tap do |outer_errors|
      begin
        extended_validator(outer_errors).send(validating_method)
      rescue StopValidationError
      end
    end
  end
end

Private Instance Methods

extended_validator(outer_errors) click to toggle source

Creates new validator object cloned from the original validator object with the new functionality:

- error code interception;
- soft quit from the original method immidietly;

@param outer_errors [SmartCore::Validator::ErrorSet] @return [SmartCore::Validator]

@raise [SmartCore::Validator::Invoker::StopValidationError]

@api private @since 0.1.0

# File lib/smart_core/validator/invoker.rb, line 78
def extended_validator(outer_errors)
  validator.dup.tap do |validator_clone|
    validator_clone.define_singleton_method(:error) do |error_code|
      outer_errors.add_error(error_code)
    end

    validator_clone.define_singleton_method(:fatal) do |error_code|
      outer_errors.add_error(error_code)
      raise StopValidationError
    end
  end
end
thread_safe(&block) click to toggle source

@param block [Proc] @return [Any]

@api private @since 0.1.0

# File lib/smart_core/validator/invoker.rb, line 96
def thread_safe(&block)
  @access_lock.synchronize(&block)
end