prelude-sdk 0.1.0.pre.alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +352 -0
  4. data/README.md +217 -0
  5. data/SECURITY.md +27 -0
  6. data/lib/prelude_sdk/client.rb +87 -0
  7. data/lib/prelude_sdk/errors.rb +214 -0
  8. data/lib/prelude_sdk/file_part.rb +55 -0
  9. data/lib/prelude_sdk/internal/transport/base_client.rb +555 -0
  10. data/lib/prelude_sdk/internal/transport/pooled_net_requester.rb +209 -0
  11. data/lib/prelude_sdk/internal/type/array_of.rb +167 -0
  12. data/lib/prelude_sdk/internal/type/base_model.rb +536 -0
  13. data/lib/prelude_sdk/internal/type/base_page.rb +55 -0
  14. data/lib/prelude_sdk/internal/type/boolean.rb +77 -0
  15. data/lib/prelude_sdk/internal/type/converter.rb +300 -0
  16. data/lib/prelude_sdk/internal/type/enum.rb +131 -0
  17. data/lib/prelude_sdk/internal/type/file_input.rb +108 -0
  18. data/lib/prelude_sdk/internal/type/hash_of.rb +187 -0
  19. data/lib/prelude_sdk/internal/type/request_parameters.rb +42 -0
  20. data/lib/prelude_sdk/internal/type/union.rb +235 -0
  21. data/lib/prelude_sdk/internal/type/unknown.rb +81 -0
  22. data/lib/prelude_sdk/internal/util.rb +914 -0
  23. data/lib/prelude_sdk/internal.rb +20 -0
  24. data/lib/prelude_sdk/models/lookup_lookup_params.rb +37 -0
  25. data/lib/prelude_sdk/models/lookup_lookup_response.rb +236 -0
  26. data/lib/prelude_sdk/models/transactional_send_params.rb +84 -0
  27. data/lib/prelude_sdk/models/transactional_send_response.rb +81 -0
  28. data/lib/prelude_sdk/models/verification_check_params.rb +69 -0
  29. data/lib/prelude_sdk/models/verification_check_response.rb +67 -0
  30. data/lib/prelude_sdk/models/verification_create_params.rb +388 -0
  31. data/lib/prelude_sdk/models/verification_create_response.rb +148 -0
  32. data/lib/prelude_sdk/models/watch_predict_params.rb +191 -0
  33. data/lib/prelude_sdk/models/watch_predict_response.rb +50 -0
  34. data/lib/prelude_sdk/models/watch_send_events_params.rb +100 -0
  35. data/lib/prelude_sdk/models/watch_send_events_response.rb +41 -0
  36. data/lib/prelude_sdk/models/watch_send_feedbacks_params.rb +229 -0
  37. data/lib/prelude_sdk/models/watch_send_feedbacks_response.rb +41 -0
  38. data/lib/prelude_sdk/models.rb +55 -0
  39. data/lib/prelude_sdk/request_options.rb +77 -0
  40. data/lib/prelude_sdk/resources/lookup.rb +42 -0
  41. data/lib/prelude_sdk/resources/transactional.rb +53 -0
  42. data/lib/prelude_sdk/resources/verification.rb +76 -0
  43. data/lib/prelude_sdk/resources/watch.rb +91 -0
  44. data/lib/prelude_sdk/version.rb +5 -0
  45. data/lib/prelude_sdk.rb +71 -0
  46. data/manifest.yaml +15 -0
  47. data/rbi/prelude_sdk/client.rbi +59 -0
  48. data/rbi/prelude_sdk/errors.rbi +178 -0
  49. data/rbi/prelude_sdk/file_part.rbi +37 -0
  50. data/rbi/prelude_sdk/internal/transport/base_client.rbi +296 -0
  51. data/rbi/prelude_sdk/internal/transport/pooled_net_requester.rbi +80 -0
  52. data/rbi/prelude_sdk/internal/type/array_of.rbi +104 -0
  53. data/rbi/prelude_sdk/internal/type/base_model.rbi +304 -0
  54. data/rbi/prelude_sdk/internal/type/base_page.rbi +42 -0
  55. data/rbi/prelude_sdk/internal/type/boolean.rbi +58 -0
  56. data/rbi/prelude_sdk/internal/type/converter.rbi +162 -0
  57. data/rbi/prelude_sdk/internal/type/enum.rbi +82 -0
  58. data/rbi/prelude_sdk/internal/type/file_input.rbi +59 -0
  59. data/rbi/prelude_sdk/internal/type/hash_of.rbi +104 -0
  60. data/rbi/prelude_sdk/internal/type/request_parameters.rbi +29 -0
  61. data/rbi/prelude_sdk/internal/type/union.rbi +121 -0
  62. data/rbi/prelude_sdk/internal/type/unknown.rbi +58 -0
  63. data/rbi/prelude_sdk/internal/util.rbi +487 -0
  64. data/rbi/prelude_sdk/internal.rbi +18 -0
  65. data/rbi/prelude_sdk/models/lookup_lookup_params.rbi +78 -0
  66. data/rbi/prelude_sdk/models/lookup_lookup_response.rbi +520 -0
  67. data/rbi/prelude_sdk/models/transactional_send_params.rbi +126 -0
  68. data/rbi/prelude_sdk/models/transactional_send_response.rbi +113 -0
  69. data/rbi/prelude_sdk/models/verification_check_params.rbi +140 -0
  70. data/rbi/prelude_sdk/models/verification_check_response.rbi +149 -0
  71. data/rbi/prelude_sdk/models/verification_create_params.rbi +805 -0
  72. data/rbi/prelude_sdk/models/verification_create_response.rbi +336 -0
  73. data/rbi/prelude_sdk/models/watch_predict_params.rbi +382 -0
  74. data/rbi/prelude_sdk/models/watch_predict_response.rbi +96 -0
  75. data/rbi/prelude_sdk/models/watch_send_events_params.rbi +245 -0
  76. data/rbi/prelude_sdk/models/watch_send_events_response.rbi +82 -0
  77. data/rbi/prelude_sdk/models/watch_send_feedbacks_params.rbi +500 -0
  78. data/rbi/prelude_sdk/models/watch_send_feedbacks_response.rbi +86 -0
  79. data/rbi/prelude_sdk/models.rbi +17 -0
  80. data/rbi/prelude_sdk/request_options.rbi +59 -0
  81. data/rbi/prelude_sdk/resources/lookup.rbi +33 -0
  82. data/rbi/prelude_sdk/resources/transactional.rbi +50 -0
  83. data/rbi/prelude_sdk/resources/verification.rbi +61 -0
  84. data/rbi/prelude_sdk/resources/watch.rbi +67 -0
  85. data/rbi/prelude_sdk/version.rbi +5 -0
  86. data/sig/prelude_sdk/client.rbs +32 -0
  87. data/sig/prelude_sdk/errors.rbs +110 -0
  88. data/sig/prelude_sdk/file_part.rbs +21 -0
  89. data/sig/prelude_sdk/internal/transport/base_client.rbs +131 -0
  90. data/sig/prelude_sdk/internal/transport/pooled_net_requester.rbs +45 -0
  91. data/sig/prelude_sdk/internal/type/array_of.rbs +48 -0
  92. data/sig/prelude_sdk/internal/type/base_model.rbs +102 -0
  93. data/sig/prelude_sdk/internal/type/base_page.rbs +24 -0
  94. data/sig/prelude_sdk/internal/type/boolean.rbs +26 -0
  95. data/sig/prelude_sdk/internal/type/converter.rbs +62 -0
  96. data/sig/prelude_sdk/internal/type/enum.rbs +32 -0
  97. data/sig/prelude_sdk/internal/type/file_input.rbs +25 -0
  98. data/sig/prelude_sdk/internal/type/hash_of.rbs +48 -0
  99. data/sig/prelude_sdk/internal/type/request_parameters.rbs +19 -0
  100. data/sig/prelude_sdk/internal/type/union.rbs +52 -0
  101. data/sig/prelude_sdk/internal/type/unknown.rbs +26 -0
  102. data/sig/prelude_sdk/internal/util.rbs +185 -0
  103. data/sig/prelude_sdk/internal.rbs +9 -0
  104. data/sig/prelude_sdk/models/lookup_lookup_params.rbs +38 -0
  105. data/sig/prelude_sdk/models/lookup_lookup_response.rbs +179 -0
  106. data/sig/prelude_sdk/models/transactional_send_params.rbs +73 -0
  107. data/sig/prelude_sdk/models/transactional_send_response.rbs +66 -0
  108. data/sig/prelude_sdk/models/verification_check_params.rbs +61 -0
  109. data/sig/prelude_sdk/models/verification_check_response.rbs +67 -0
  110. data/sig/prelude_sdk/models/verification_create_params.rbs +345 -0
  111. data/sig/prelude_sdk/models/verification_create_response.rbs +136 -0
  112. data/sig/prelude_sdk/models/watch_predict_params.rbs +180 -0
  113. data/sig/prelude_sdk/models/watch_predict_response.rbs +41 -0
  114. data/sig/prelude_sdk/models/watch_send_events_params.rbs +98 -0
  115. data/sig/prelude_sdk/models/watch_send_events_response.rbs +35 -0
  116. data/sig/prelude_sdk/models/watch_send_feedbacks_params.rbs +211 -0
  117. data/sig/prelude_sdk/models/watch_send_feedbacks_response.rbs +35 -0
  118. data/sig/prelude_sdk/models.rbs +15 -0
  119. data/sig/prelude_sdk/request_options.rbs +36 -0
  120. data/sig/prelude_sdk/resources/lookup.rbs +13 -0
  121. data/sig/prelude_sdk/resources/transactional.rbs +19 -0
  122. data/sig/prelude_sdk/resources/verification.rbs +22 -0
  123. data/sig/prelude_sdk/resources/watch.rbs +25 -0
  124. data/sig/prelude_sdk/version.rbs +3 -0
  125. metadata +182 -0
@@ -0,0 +1,300 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PreludeSDK
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ module Converter
8
+ extend PreludeSDK::Internal::Util::SorbetRuntimeSupport
9
+
10
+ # rubocop:disable Lint/UnusedMethodArgument
11
+
12
+ # @api private
13
+ #
14
+ # @param value [Object]
15
+ #
16
+ # @param state [Hash{Symbol=>Object}] .
17
+ #
18
+ # @option state [Boolean] :translate_names
19
+ #
20
+ # @option state [Boolean] :strictness
21
+ #
22
+ # @option state [Hash{Symbol=>Object}] :exactness
23
+ #
24
+ # @option state [Class<StandardError>] :error
25
+ #
26
+ # @option state [Integer] :branched
27
+ #
28
+ # @return [Object]
29
+ def coerce(value, state:) = (raise NotImplementedError)
30
+
31
+ # @api private
32
+ #
33
+ # @param value [Object]
34
+ #
35
+ # @param state [Hash{Symbol=>Object}] .
36
+ #
37
+ # @option state [Boolean] :can_retry
38
+ #
39
+ # @return [Object]
40
+ def dump(value, state:)
41
+ case value
42
+ in Array
43
+ value.map { PreludeSDK::Internal::Type::Unknown.dump(_1, state: state) }
44
+ in Hash
45
+ value.transform_values { PreludeSDK::Internal::Type::Unknown.dump(_1, state: state) }
46
+ in PreludeSDK::Internal::Type::BaseModel
47
+ value.class.dump(value, state: state)
48
+ in StringIO
49
+ value.string
50
+ in Pathname | IO
51
+ state[:can_retry] = false if value.is_a?(IO)
52
+ PreludeSDK::FilePart.new(value)
53
+ in PreludeSDK::FilePart
54
+ state[:can_retry] = false if value.content.is_a?(IO)
55
+ value
56
+ else
57
+ value
58
+ end
59
+ end
60
+
61
+ # @api private
62
+ #
63
+ # @param depth [Integer]
64
+ #
65
+ # @return [String]
66
+ def inspect(depth: 0)
67
+ super()
68
+ end
69
+
70
+ # rubocop:enable Lint/UnusedMethodArgument
71
+
72
+ class << self
73
+ # @api private
74
+ #
75
+ # @param spec [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class] .
76
+ #
77
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
78
+ #
79
+ # @option spec [Proc] :enum
80
+ #
81
+ # @option spec [Proc] :union
82
+ #
83
+ # @option spec [Boolean] :"nil?"
84
+ #
85
+ # @return [Proc]
86
+ def type_info(spec)
87
+ case spec
88
+ in Proc
89
+ spec
90
+ in Hash
91
+ type_info(spec.slice(:const, :enum, :union).first&.last)
92
+ in true | false
93
+ -> { PreludeSDK::Internal::Type::Boolean }
94
+ in PreludeSDK::Internal::Type::Converter | Class | Symbol
95
+ -> { spec }
96
+ in NilClass | Integer | Float
97
+ -> { spec.class }
98
+ end
99
+ end
100
+
101
+ # @api private
102
+ #
103
+ # @param translate_names [Boolean]
104
+ #
105
+ # @return [Hash{Symbol=>Object}]
106
+ def new_coerce_state(translate_names: true)
107
+ {
108
+ translate_names: translate_names,
109
+ strictness: true,
110
+ exactness: {yes: 0, no: 0, maybe: 0},
111
+ error: nil,
112
+ branched: 0
113
+ }
114
+ end
115
+
116
+ # @api private
117
+ #
118
+ # Based on `target`, transform `value` into `target`, to the extent possible:
119
+ #
120
+ # 1. if the given `value` conforms to `target` already, return the given `value`
121
+ # 2. if it's possible and safe to convert the given `value` to `target`, then the
122
+ # converted value
123
+ # 3. otherwise, the given `value` unaltered
124
+ #
125
+ # The coercion process is subject to improvement between minor release versions.
126
+ # See https://docs.pydantic.dev/latest/concepts/unions/#smart-mode
127
+ #
128
+ # @param target [PreludeSDK::Internal::Type::Converter, Class]
129
+ #
130
+ # @param value [Object]
131
+ #
132
+ # @param state [Hash{Symbol=>Object}] The `strictness` is one of `true`, `false`. This informs the coercion strategy
133
+ # when we have to decide between multiple possible conversion targets:
134
+ #
135
+ # - `true`: the conversion must be exact, with minimum coercion.
136
+ # - `false`: the conversion can be approximate, with some coercion.
137
+ #
138
+ # The `exactness` is `Hash` with keys being one of `yes`, `no`, or `maybe`. For
139
+ # any given conversion attempt, the exactness will be updated based on how closely
140
+ # the value recursively matches the target type:
141
+ #
142
+ # - `yes`: the value can be converted to the target type with minimum coercion.
143
+ # - `maybe`: the value can be converted to the target type with some reasonable
144
+ # coercion.
145
+ # - `no`: the value cannot be converted to the target type.
146
+ #
147
+ # See implementation below for more details.
148
+ #
149
+ # @option state [Boolean] :translate_names
150
+ #
151
+ # @option state [Boolean] :strictness
152
+ #
153
+ # @option state [Hash{Symbol=>Object}] :exactness
154
+ #
155
+ # @option state [Class<StandardError>] :error
156
+ #
157
+ # @option state [Integer] :branched
158
+ #
159
+ # @return [Object]
160
+ def coerce(target, value, state: PreludeSDK::Internal::Type::Converter.new_coerce_state)
161
+ # rubocop:disable Metrics/BlockNesting
162
+ exactness = state.fetch(:exactness)
163
+
164
+ case target
165
+ in PreludeSDK::Internal::Type::Converter
166
+ return target.coerce(value, state: state)
167
+ in Class
168
+ if value.is_a?(target)
169
+ exactness[:yes] += 1
170
+ return value
171
+ end
172
+
173
+ case target
174
+ in -> { _1 <= NilClass }
175
+ exactness[value.nil? ? :yes : :maybe] += 1
176
+ return nil
177
+ in -> { _1 <= Integer }
178
+ case value
179
+ in Integer
180
+ exactness[:yes] += 1
181
+ return value
182
+ else
183
+ Kernel.then do
184
+ return Integer(value).tap { exactness[:maybe] += 1 }
185
+ rescue ArgumentError, TypeError => e
186
+ state[:error] = e
187
+ end
188
+ end
189
+ in -> { _1 <= Float }
190
+ if value.is_a?(Numeric)
191
+ exactness[:yes] += 1
192
+ return Float(value)
193
+ else
194
+ Kernel.then do
195
+ return Float(value).tap { exactness[:maybe] += 1 }
196
+ rescue ArgumentError, TypeError => e
197
+ state[:error] = e
198
+ end
199
+ end
200
+ in -> { _1 <= String }
201
+ case value
202
+ in String | Symbol | Numeric
203
+ exactness[value.is_a?(Numeric) ? :maybe : :yes] += 1
204
+ return value.to_s
205
+ in StringIO
206
+ exactness[:yes] += 1
207
+ return value.string
208
+ else
209
+ state[:error] = TypeError.new("#{value.class} can't be coerced into #{String}")
210
+ end
211
+ in -> { _1 <= Date || _1 <= Time }
212
+ Kernel.then do
213
+ return target.parse(value).tap { exactness[:yes] += 1 }
214
+ rescue ArgumentError, TypeError => e
215
+ state[:error] = e
216
+ end
217
+ in -> { _1 <= StringIO } if value.is_a?(String)
218
+ exactness[:yes] += 1
219
+ return StringIO.new(value.b)
220
+ else
221
+ end
222
+ in Symbol
223
+ case value
224
+ in Symbol | String
225
+ if value.to_sym == target
226
+ exactness[:yes] += 1
227
+ return target
228
+ else
229
+ exactness[:maybe] += 1
230
+ return value
231
+ end
232
+ else
233
+ message = "cannot convert non-matching #{value.class} into #{target.inspect}"
234
+ state[:error] = ArgumentError.new(message)
235
+ end
236
+ else
237
+ end
238
+
239
+ exactness[:no] += 1
240
+ value
241
+ # rubocop:enable Metrics/BlockNesting
242
+ end
243
+
244
+ # @api private
245
+ #
246
+ # @param target [PreludeSDK::Internal::Type::Converter, Class]
247
+ #
248
+ # @param value [Object]
249
+ #
250
+ # @param state [Hash{Symbol=>Object}] .
251
+ #
252
+ # @option state [Boolean] :can_retry
253
+ #
254
+ # @return [Object]
255
+ def dump(target, value, state: {can_retry: true})
256
+ case target
257
+ in PreludeSDK::Internal::Type::Converter
258
+ target.dump(value, state: state)
259
+ else
260
+ PreludeSDK::Internal::Type::Unknown.dump(value, state: state)
261
+ end
262
+ end
263
+
264
+ # @api private
265
+ #
266
+ # @param target [Object]
267
+ # @param depth [Integer]
268
+ #
269
+ # @return [String]
270
+ def inspect(target, depth:)
271
+ case target
272
+ in PreludeSDK::Internal::Type::Converter
273
+ target.inspect(depth: depth.succ)
274
+ else
275
+ target.inspect
276
+ end
277
+ end
278
+ end
279
+
280
+ define_sorbet_constant!(:Input) do
281
+ T.type_alias { T.any(PreludeSDK::Internal::Type::Converter, T::Class[T.anything]) }
282
+ end
283
+ define_sorbet_constant!(:CoerceState) do
284
+ T.type_alias do
285
+ {
286
+ translate_names: T::Boolean,
287
+ strictness: T::Boolean,
288
+ exactness: {yes: Integer, no: Integer, maybe: Integer},
289
+ error: T::Class[StandardError],
290
+ branched: Integer
291
+ }
292
+ end
293
+ end
294
+ define_sorbet_constant!(:DumpState) do
295
+ T.type_alias { {can_retry: T::Boolean} }
296
+ end
297
+ end
298
+ end
299
+ end
300
+ end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PreludeSDK
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ # A value from among a specified list of options. OpenAPI enum values map to Ruby
9
+ # values in the SDK as follows:
10
+ #
11
+ # 1. boolean => true | false
12
+ # 2. integer => Integer
13
+ # 3. float => Float
14
+ # 4. string => Symbol
15
+ #
16
+ # We can therefore convert string values to Symbols, but can't convert other
17
+ # values safely.
18
+ module Enum
19
+ include PreludeSDK::Internal::Type::Converter
20
+ include PreludeSDK::Internal::Util::SorbetRuntimeSupport
21
+
22
+ # All of the valid Symbol values for this enum.
23
+ #
24
+ # @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
25
+ def values = constants.map { const_get(_1) }
26
+
27
+ # @api public
28
+ #
29
+ # @param other [Object]
30
+ #
31
+ # @return [Boolean]
32
+ def ===(other) = values.include?(other)
33
+
34
+ # @api public
35
+ #
36
+ # @param other [Object]
37
+ #
38
+ # @return [Boolean]
39
+ def ==(other)
40
+ # rubocop:disable Style/CaseEquality
41
+ PreludeSDK::Internal::Type::Enum === other && other.values.to_set == values.to_set
42
+ # rubocop:enable Style/CaseEquality
43
+ end
44
+
45
+ # @api public
46
+ #
47
+ # @return [Integer]
48
+ def hash = values.to_set.hash
49
+
50
+ # @api private
51
+ #
52
+ # Unlike with primitives, `Enum` additionally validates that the value is a member
53
+ # of the enum.
54
+ #
55
+ # @param value [String, Symbol, Object]
56
+ #
57
+ # @param state [Hash{Symbol=>Object}] .
58
+ #
59
+ # @option state [Boolean] :translate_names
60
+ #
61
+ # @option state [Boolean] :strictness
62
+ #
63
+ # @option state [Hash{Symbol=>Object}] :exactness
64
+ #
65
+ # @option state [Class<StandardError>] :error
66
+ #
67
+ # @option state [Integer] :branched
68
+ #
69
+ # @return [Symbol, Object]
70
+ def coerce(value, state:)
71
+ exactness = state.fetch(:exactness)
72
+ val = value.is_a?(String) ? value.to_sym : value
73
+
74
+ if values.include?(val)
75
+ exactness[:yes] += 1
76
+ val
77
+ elsif values.first&.class == val.class
78
+ exactness[:maybe] += 1
79
+ value
80
+ else
81
+ exactness[:no] += 1
82
+ state[:error] = TypeError.new("#{value.class} can't be coerced into #{self}")
83
+ value
84
+ end
85
+ end
86
+
87
+ # @!method dump(value, state:)
88
+ # @api private
89
+ #
90
+ # @param value [Symbol, Object]
91
+ #
92
+ # @param state [Hash{Symbol=>Object}] .
93
+ #
94
+ # @option state [Boolean] :can_retry
95
+ #
96
+ # @return [Symbol, Object]
97
+
98
+ # @api private
99
+ #
100
+ # @return [Object]
101
+ def to_sorbet_type
102
+ types = values.map { PreludeSDK::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(_1) }.uniq
103
+ case types
104
+ in []
105
+ T.noreturn
106
+ in [type]
107
+ type
108
+ else
109
+ T.any(*types)
110
+ end
111
+ end
112
+
113
+ # @api private
114
+ #
115
+ # @param depth [Integer]
116
+ #
117
+ # @return [String]
118
+ def inspect(depth: 0)
119
+ if depth.positive?
120
+ return is_a?(Module) ? super() : self.class.name
121
+ end
122
+
123
+ members = values.map { PreludeSDK::Internal::Type::Converter.inspect(_1, depth: depth.succ) }
124
+ prefix = is_a?(Module) ? name : self.class.name
125
+
126
+ "#{prefix}[#{members.join(' | ')}]"
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PreludeSDK
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ # @abstract
9
+ #
10
+ # Either `Pathname` or `StringIO`, or `IO`, or
11
+ # `PreludeSDK::Internal::Type::FileInput`.
12
+ #
13
+ # Note: when `IO` is used, all retries are disabled, since many IO` streams are
14
+ # not rewindable.
15
+ class FileInput
16
+ extend PreludeSDK::Internal::Type::Converter
17
+
18
+ private_class_method :new
19
+
20
+ # @api public
21
+ #
22
+ # @param other [Object]
23
+ #
24
+ # @return [Boolean]
25
+ def self.===(other)
26
+ case other
27
+ in Pathname | StringIO | IO | String | PreludeSDK::FilePart
28
+ true
29
+ else
30
+ false
31
+ end
32
+ end
33
+
34
+ # @api public
35
+ #
36
+ # @param other [Object]
37
+ #
38
+ # @return [Boolean]
39
+ def self.==(other) = other.is_a?(Class) && other <= PreludeSDK::Internal::Type::FileInput
40
+
41
+ class << self
42
+ # @api private
43
+ #
44
+ # @param value [StringIO, String, Object]
45
+ #
46
+ # @param state [Hash{Symbol=>Object}] .
47
+ #
48
+ # @option state [Boolean] :translate_names
49
+ #
50
+ # @option state [Boolean] :strictness
51
+ #
52
+ # @option state [Hash{Symbol=>Object}] :exactness
53
+ #
54
+ # @option state [Class<StandardError>] :error
55
+ #
56
+ # @option state [Integer] :branched
57
+ #
58
+ # @return [StringIO, Object]
59
+ def coerce(value, state:)
60
+ exactness = state.fetch(:exactness)
61
+ case value
62
+ in String
63
+ exactness[:yes] += 1
64
+ StringIO.new(value)
65
+ in StringIO
66
+ exactness[:yes] += 1
67
+ value
68
+ else
69
+ state[:error] = TypeError.new("#{value.class} can't be coerced into #{StringIO}")
70
+ exactness[:no] += 1
71
+ value
72
+ end
73
+ end
74
+
75
+ # @api private
76
+ #
77
+ # @param value [Pathname, StringIO, IO, String, Object]
78
+ #
79
+ # @param state [Hash{Symbol=>Object}] .
80
+ #
81
+ # @option state [Boolean] :can_retry
82
+ #
83
+ # @return [Pathname, StringIO, IO, String, Object]
84
+ def dump(value, state:)
85
+ # rubocop:disable Lint/DuplicateBranch
86
+ case value
87
+ in IO
88
+ state[:can_retry] = false
89
+ in PreludeSDK::FilePart if value.content.is_a?(IO)
90
+ state[:can_retry] = false
91
+ else
92
+ end
93
+ # rubocop:enable Lint/DuplicateBranch
94
+
95
+ value
96
+ end
97
+
98
+ # @api private
99
+ #
100
+ # @return [Object]
101
+ def to_sorbet_type
102
+ T.any(Pathname, StringIO, IO, String, PreludeSDK::FilePart)
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end