1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module Value
9
10 module Core
11
12 module_function
13
14 # Atom type
15
16 def validate_bool(value, meth_name, loc, env)
17 ASSERT.kind_of value, VC::Top
18 ASSERT.kind_of meth_name, ::String
19
20 VC.validate_type value, VCA::Bool, meth_name, loc, env
21
22 value.val
23 end
24
25
26 def validate_string(value, meth_name, loc, env)
27 ASSERT.kind_of value, VC::Top
28 ASSERT.kind_of meth_name, ::String
29
30 VC.validate_type value, VCA::String, meth_name, loc, env
31
32 value.val
33 end
34
35
36 def validate_number(value, meth_name, loc, env)
37 ASSERT.kind_of value, VC::Top
38 ASSERT.kind_of meth_name, ::String
39
40 VC.validate_type value, VCAN::Abstract, meth_name, loc, env
41
42 value.val
43 end
44
45
46 def validate_int(value, meth_name, loc, env)
47 ASSERT.kind_of value, VC::Top
48 ASSERT.kind_of meth_name, ::String
49
50 VC.validate_type value, VCAN::Int, meth_name, loc, env
51
52 value.val
53 end
54
55
56 # Direct Product type
57
58 def validate_pair(pair, meth_name, loc, env)
59 ASSERT.kind_of pair, VC::Top
60 ASSERT.kind_of meth_name, ::String
61
62 VC.validate_type pair, VCP::Tuple, meth_name, loc, env
63
64 vals = pair.values
65 unless vals.size == 2
66 raise X::TypeError.new(
67 loc,
68 env,
69 "%s: Expected arity of the tuple is 2, but %s",
70 meth_name,
71 pair.to_s
72 )
73 end
74
75 vals
76 end
77
78
79 # Disjoint Union type
80
81 def validate_option(value, meth_name, loc, env)
82 ASSERT.kind_of value, VC::Top
83 ASSERT.kind_of meth_name, ::String
84
85 VC.validate_type value, VCU::Option::Abstract, meth_name, loc, env
86
87 nil
88 end
89
90
91 # Morph type
92
93 def validate_morph(value, meth_name, loc, env)
94 ASSERT.kind_of value, VC::Top
95 ASSERT.kind_of meth_name, ::String
96
97 VC.validate_type value, VCM::Abstract, meth_name, loc, env
98
99 nil
100 end
101
102
103 # Stream type
104
105 def validate_stream(value, meth_name, loc, env)
106 ASSERT.kind_of value, VC::Top
107 ASSERT.kind_of meth_name, ::String
108
109 VC.validate_type(
110 value, VCM::Stream::Entry::Abstract, meth_name, loc, env
111 )
112
113 nil
114 end
115
116
117 # S-Expression type
118
119 def validate_s_expr(value, meth_name, loc, env)
120 ASSERT.kind_of value, VC::Top
121 ASSERT.kind_of meth_name, ::String
122
123 VC.validate_type value, VC::SExpr::Abstract, meth_name, loc, env
124
125 nil
126 end
127
128
129 # Top type
130
131 def validate_type(actual_value, expected_type, meth_name, loc, env)
132 ASSERT.kind_of actual_value, VC::Top
133 ASSERT.subclass_of expected_type, VC::Top
134 ASSERT.kind_of meth_name, ::String
135
136 unless actual_value.kind_of? expected_type
137 raise X::TypeError.new(
138 loc,
139 env,
140 "%s: Expected a %s, but %s : %s",
141 meth_name,
142 expected_type.type_sym.to_s,
143 actual_value.to_s,
144 actual_value.type_sym.to_s
145 )
146 end
147
148 actual_value
149 end
150
151 end # Umu::Value::Core
152
153 end # Umu::Value
154
155 end # Umu