File: coerce.rb

package info (click to toggle)
ruby-morpher 0.2.6-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 520 kB
  • sloc: ruby: 2,366; makefile: 4
file content (166 lines) | stat: -rw-r--r-- 3,734 bytes parent folder | download
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