1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
module Morpher
class Evaluator
class Transformer
# Abstract namespace class for coercing transformers
class Coerce < self
include AbstractType, Nullary::Parameterized, Transitive
# Parse mixin for cases the parsing possibly results
# in Argument and Type errors.
module Parse
# Call evaluator
#
# @param [Object] input
#
# @return [Object]
#
# @api private
#
def call(input)
invoke(input)
rescue ArgumentError, TypeError
raise_transform_error(input)
end
# Return evaluation
#
# @param [Object] input
#
# @return [Evaluation]
#
# @api private
#
def evaluation(input)
evaluation_success(input, invoke(input))
rescue ArgumentError, TypeError
evaluation_error(input)
end
end # Parse
# Evaluator for parsing an integer
class ParseInt < self
include Parse
register :parse_int
# Return inverse evaluator
#
# @return [Evaluator]
#
# @api private
#
def inverse
IntToString.new(param)
end
private
# Invoke coercion
#
# @return [Integer]
#
# @raise [ArgumentError, TypeError]
# if coercion does not succeed
#
# @api private
#
def invoke(input)
Integer(input, param)
end
end # ParseInt
# Evaluator for dumping fixnums to strings
class IntToString < self
register :int_to_string
# Call evaluator
#
# @param [Object] input
#
# @return [Hash<Symbol, Object>]
#
# @api private
#
def call(input)
input.to_s(param)
end
# Return inverse evaluator
#
# @return [Evaluator]
#
# @api private
#
def inverse
ParseInt.new(param)
end
end # IntToString
# Evaluator for parsing an ISO8601 String into a DateTime
class ParseIso8601DateTime < self
include Parse
register :parse_iso8601_date_time
# Return inverse evaluator
#
# @return [Evaluator]
#
# @api private
#
def inverse
DateTimeToIso8601String.new(param)
end
private
# Invoke coercion
#
# @return [DateTime]
#
# @raise [ArgumentError, TypeError]
# if coercion does not succeed
#
# @api private
#
def invoke(input)
DateTime.iso8601(input)
end
end # ParseIso8601DateTime
# Evaluator for dumping a DateTime to an ISO8601 string
class DateTimeToIso8601String < self
register :date_time_to_iso8601_string
# Call evaluator
#
# @param [Object] input
#
# @return [Object]
#
# @api private
#
def call(input)
input.iso8601(param)
end
# Return inverse evaluator
#
# @return [Evaluator]
#
# @api private
#
def inverse
ParseIso8601DateTime.new(param)
end
end # DateTimeToIso8601String
end # Fixnum
end # Transformer
end # Evaluator
end # Morpher
|