Class: NRSER::Types::Type

Inherits:
Object
  • Object
show all
Defined in:
lib/nrser/types/type.rb

Direct Known Subclasses

Attrs, Bounded, Combinator, Is, IsA, Responds, Where

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name: nil, from_s: nil) ⇒ Type

Instantiate a new ‘NRSER::Types::Type`.

Parameters:

  • name: (nil | String) (defaults to: nil)

    Name that will be used when displaying the type, or ‘nil` to use a default generated name.

  • from_s: (nil | #call) (defaults to: nil)

    Callable that will be passed a String and should return an object that satisfies the type if it possible to create one.

    The returned value will be checked against the type, so returning a value that doesn’t satisfy will result in a TypeError being raised by #from_s.



28
29
30
31
# File 'lib/nrser/types/type.rb', line 28

def initialize name: nil, from_s: nil
  @name = name
  @from_s = from_s
end

Class Method Details

.short_nameObject



6
7
8
# File 'lib/nrser/types/type.rb', line 6

def self.short_name
  name.split('::').last
end

Instance Method Details

#check(value, &make_fail_message) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/nrser/types/type.rb', line 46

def check value, &make_fail_message
  # success case
  return value if test value
  
  msg = if make_fail_message
    make_fail_message.call type: self, value: value
  else
    NRSER.squish <<-END
      value #{ value.inspect } failed check #{ self.to_s }
    END
  end
  
  raise TypeError.new msg
end

#default_nameObject



38
39
40
# File 'lib/nrser/types/type.rb', line 38

def default_name
  self.class.short_name
end

#from_s(s) ⇒ Object



69
70
71
72
73
74
75
# File 'lib/nrser/types/type.rb', line 69

def from_s s
  if @from_s.nil?
    raise NoMethodError, "#from_s not defined"
  end
  
  check @from_s.call( s )
end

#has_from_s?Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/nrser/types/type.rb', line 77

def has_from_s?
  ! @from_s.nil?
end

#nameObject



34
35
36
# File 'lib/nrser/types/type.rb', line 34

def name
  @name || default_name
end

#respond_to?(name, include_all = false) ⇒ Boolean

Returns:

  • (Boolean)


61
62
63
64
65
66
67
# File 'lib/nrser/types/type.rb', line 61

def respond_to? name, include_all = false
  if name == :from_s || name == 'from_s'
    has_from_s?
  else
    super name, include_all
  end
end

#test(value) ⇒ Object

Raises:

  • (NotImplementedError)


42
43
44
# File 'lib/nrser/types/type.rb', line 42

def test value
  raise NotImplementedError
end

#to_sObject



81
82
83
# File 'lib/nrser/types/type.rb', line 81

def to_s
  "`Type: #{ name }`"
end