class RSchema::Schemas::Enum

A schema that matches a values in a given set.

@example Rock-Paper-Scissors values

schema = RSchema.define { enum([:rock, :paper, :scissors]) }
schema.valid?(:rock)  #=> true
schema.valid?(:paper) #=> true
schema.valid?(:gun)   #=> false

Attributes

members[R]
subschema[R]

Public Class Methods

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

Public Instance Methods

call(value, options) click to toggle source
# File lib/rschema/schemas/enum.rb, line 22
def call(value, options)
  subresult = subschema.call(value, options)
  if subresult.invalid?
    subresult
  elsif members.include?(subresult.value)
    subresult
  else
    Result.failure(error(subresult.value))
  end
end
with_wrapped_subschemas(wrapper) click to toggle source
# File lib/rschema/schemas/enum.rb, line 33
def with_wrapped_subschemas(wrapper)
  self.class.new(members, wrapper.wrap(subschema))
end

Private Instance Methods

error(value) click to toggle source
# File lib/rschema/schemas/enum.rb, line 39
def error(value)
  Error.new(
    schema: self,
    value: value,
    symbolic_name: :not_a_member,
  )
end