class RSchema::Schemas::Set

A schema that matches `Set` objects (from the Ruby standard library)

@example A set of integers

require 'set'
schema = RSchema.define { set(_Integer) }
schema.valid?(Set[1, 2, 3]) #=> true
schema.valid?(Set[:a, :b, :c]) #=> false

Attributes

subschema[R]

Public Class Methods

new(subschema) click to toggle source
# File lib/rschema/schemas/set.rb, line 19
def initialize(subschema)
  @subschema = subschema
end

Public Instance Methods

call(value, options) click to toggle source
# File lib/rschema/schemas/set.rb, line 23
def call(value, options)
  return not_a_set_result(value) unless value.is_a?(::Set)

  validated_set, errors = apply_subschema(value, options)

  if errors.empty?
    Result.success(validated_set)
  else
    Result.failure(errors)
  end
end
with_wrapped_subschemas(wrapper) click to toggle source
# File lib/rschema/schemas/set.rb, line 35
def with_wrapped_subschemas(wrapper)
  wrapped_subschema = wrapper.wrap(subschema)
  self.class.new(wrapped_subschema)
end

Private Instance Methods

apply_subschema(set, options) click to toggle source
# File lib/rschema/schemas/set.rb, line 42
def apply_subschema(set, options)
  validated_set = ::Set.new
  errors = {}

  set.each do |subvalue|
    subresult = subschema.call(subvalue, options)
    if subresult.valid?
      validated_set << subresult.value
    else
      errors[subvalue] = subresult.error
      break if options.fail_fast?
    end
  end

  [validated_set, errors]
end
not_a_set_result(value) click to toggle source
# File lib/rschema/schemas/set.rb, line 59
def not_a_set_result(value)
  Result.failure(
    Error.new(
      schema: self,
      symbolic_name: :not_a_set,
      value: value,
    ),
  )
end