File: value/core/validate-type.rb

Overview
Module Structure
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Umu#6
  module: Value#8
  module: Core#10
has properties
function: validate_bool / 4 #16
function: validate_string / 4 #26
function: validate_number / 4 #36
function: validate_int / 4 #46
function: validate_pair / 4 #58
function: validate_option / 4 #81
function: validate_morph / 4 #93
function: validate_stream / 4 #105
function: validate_s_expr / 4 #119
function: validate_type / 5 #131

Code

   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