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.
- checksums.yaml +7 -0
- data/.ignore +2 -0
- data/CHANGELOG.md +352 -0
- data/README.md +217 -0
- data/SECURITY.md +27 -0
- data/lib/prelude_sdk/client.rb +87 -0
- data/lib/prelude_sdk/errors.rb +214 -0
- data/lib/prelude_sdk/file_part.rb +55 -0
- data/lib/prelude_sdk/internal/transport/base_client.rb +555 -0
- data/lib/prelude_sdk/internal/transport/pooled_net_requester.rb +209 -0
- data/lib/prelude_sdk/internal/type/array_of.rb +167 -0
- data/lib/prelude_sdk/internal/type/base_model.rb +536 -0
- data/lib/prelude_sdk/internal/type/base_page.rb +55 -0
- data/lib/prelude_sdk/internal/type/boolean.rb +77 -0
- data/lib/prelude_sdk/internal/type/converter.rb +300 -0
- data/lib/prelude_sdk/internal/type/enum.rb +131 -0
- data/lib/prelude_sdk/internal/type/file_input.rb +108 -0
- data/lib/prelude_sdk/internal/type/hash_of.rb +187 -0
- data/lib/prelude_sdk/internal/type/request_parameters.rb +42 -0
- data/lib/prelude_sdk/internal/type/union.rb +235 -0
- data/lib/prelude_sdk/internal/type/unknown.rb +81 -0
- data/lib/prelude_sdk/internal/util.rb +914 -0
- data/lib/prelude_sdk/internal.rb +20 -0
- data/lib/prelude_sdk/models/lookup_lookup_params.rb +37 -0
- data/lib/prelude_sdk/models/lookup_lookup_response.rb +236 -0
- data/lib/prelude_sdk/models/transactional_send_params.rb +84 -0
- data/lib/prelude_sdk/models/transactional_send_response.rb +81 -0
- data/lib/prelude_sdk/models/verification_check_params.rb +69 -0
- data/lib/prelude_sdk/models/verification_check_response.rb +67 -0
- data/lib/prelude_sdk/models/verification_create_params.rb +388 -0
- data/lib/prelude_sdk/models/verification_create_response.rb +148 -0
- data/lib/prelude_sdk/models/watch_predict_params.rb +191 -0
- data/lib/prelude_sdk/models/watch_predict_response.rb +50 -0
- data/lib/prelude_sdk/models/watch_send_events_params.rb +100 -0
- data/lib/prelude_sdk/models/watch_send_events_response.rb +41 -0
- data/lib/prelude_sdk/models/watch_send_feedbacks_params.rb +229 -0
- data/lib/prelude_sdk/models/watch_send_feedbacks_response.rb +41 -0
- data/lib/prelude_sdk/models.rb +55 -0
- data/lib/prelude_sdk/request_options.rb +77 -0
- data/lib/prelude_sdk/resources/lookup.rb +42 -0
- data/lib/prelude_sdk/resources/transactional.rb +53 -0
- data/lib/prelude_sdk/resources/verification.rb +76 -0
- data/lib/prelude_sdk/resources/watch.rb +91 -0
- data/lib/prelude_sdk/version.rb +5 -0
- data/lib/prelude_sdk.rb +71 -0
- data/manifest.yaml +15 -0
- data/rbi/prelude_sdk/client.rbi +59 -0
- data/rbi/prelude_sdk/errors.rbi +178 -0
- data/rbi/prelude_sdk/file_part.rbi +37 -0
- data/rbi/prelude_sdk/internal/transport/base_client.rbi +296 -0
- data/rbi/prelude_sdk/internal/transport/pooled_net_requester.rbi +80 -0
- data/rbi/prelude_sdk/internal/type/array_of.rbi +104 -0
- data/rbi/prelude_sdk/internal/type/base_model.rbi +304 -0
- data/rbi/prelude_sdk/internal/type/base_page.rbi +42 -0
- data/rbi/prelude_sdk/internal/type/boolean.rbi +58 -0
- data/rbi/prelude_sdk/internal/type/converter.rbi +162 -0
- data/rbi/prelude_sdk/internal/type/enum.rbi +82 -0
- data/rbi/prelude_sdk/internal/type/file_input.rbi +59 -0
- data/rbi/prelude_sdk/internal/type/hash_of.rbi +104 -0
- data/rbi/prelude_sdk/internal/type/request_parameters.rbi +29 -0
- data/rbi/prelude_sdk/internal/type/union.rbi +121 -0
- data/rbi/prelude_sdk/internal/type/unknown.rbi +58 -0
- data/rbi/prelude_sdk/internal/util.rbi +487 -0
- data/rbi/prelude_sdk/internal.rbi +18 -0
- data/rbi/prelude_sdk/models/lookup_lookup_params.rbi +78 -0
- data/rbi/prelude_sdk/models/lookup_lookup_response.rbi +520 -0
- data/rbi/prelude_sdk/models/transactional_send_params.rbi +126 -0
- data/rbi/prelude_sdk/models/transactional_send_response.rbi +113 -0
- data/rbi/prelude_sdk/models/verification_check_params.rbi +140 -0
- data/rbi/prelude_sdk/models/verification_check_response.rbi +149 -0
- data/rbi/prelude_sdk/models/verification_create_params.rbi +805 -0
- data/rbi/prelude_sdk/models/verification_create_response.rbi +336 -0
- data/rbi/prelude_sdk/models/watch_predict_params.rbi +382 -0
- data/rbi/prelude_sdk/models/watch_predict_response.rbi +96 -0
- data/rbi/prelude_sdk/models/watch_send_events_params.rbi +245 -0
- data/rbi/prelude_sdk/models/watch_send_events_response.rbi +82 -0
- data/rbi/prelude_sdk/models/watch_send_feedbacks_params.rbi +500 -0
- data/rbi/prelude_sdk/models/watch_send_feedbacks_response.rbi +86 -0
- data/rbi/prelude_sdk/models.rbi +17 -0
- data/rbi/prelude_sdk/request_options.rbi +59 -0
- data/rbi/prelude_sdk/resources/lookup.rbi +33 -0
- data/rbi/prelude_sdk/resources/transactional.rbi +50 -0
- data/rbi/prelude_sdk/resources/verification.rbi +61 -0
- data/rbi/prelude_sdk/resources/watch.rbi +67 -0
- data/rbi/prelude_sdk/version.rbi +5 -0
- data/sig/prelude_sdk/client.rbs +32 -0
- data/sig/prelude_sdk/errors.rbs +110 -0
- data/sig/prelude_sdk/file_part.rbs +21 -0
- data/sig/prelude_sdk/internal/transport/base_client.rbs +131 -0
- data/sig/prelude_sdk/internal/transport/pooled_net_requester.rbs +45 -0
- data/sig/prelude_sdk/internal/type/array_of.rbs +48 -0
- data/sig/prelude_sdk/internal/type/base_model.rbs +102 -0
- data/sig/prelude_sdk/internal/type/base_page.rbs +24 -0
- data/sig/prelude_sdk/internal/type/boolean.rbs +26 -0
- data/sig/prelude_sdk/internal/type/converter.rbs +62 -0
- data/sig/prelude_sdk/internal/type/enum.rbs +32 -0
- data/sig/prelude_sdk/internal/type/file_input.rbs +25 -0
- data/sig/prelude_sdk/internal/type/hash_of.rbs +48 -0
- data/sig/prelude_sdk/internal/type/request_parameters.rbs +19 -0
- data/sig/prelude_sdk/internal/type/union.rbs +52 -0
- data/sig/prelude_sdk/internal/type/unknown.rbs +26 -0
- data/sig/prelude_sdk/internal/util.rbs +185 -0
- data/sig/prelude_sdk/internal.rbs +9 -0
- data/sig/prelude_sdk/models/lookup_lookup_params.rbs +38 -0
- data/sig/prelude_sdk/models/lookup_lookup_response.rbs +179 -0
- data/sig/prelude_sdk/models/transactional_send_params.rbs +73 -0
- data/sig/prelude_sdk/models/transactional_send_response.rbs +66 -0
- data/sig/prelude_sdk/models/verification_check_params.rbs +61 -0
- data/sig/prelude_sdk/models/verification_check_response.rbs +67 -0
- data/sig/prelude_sdk/models/verification_create_params.rbs +345 -0
- data/sig/prelude_sdk/models/verification_create_response.rbs +136 -0
- data/sig/prelude_sdk/models/watch_predict_params.rbs +180 -0
- data/sig/prelude_sdk/models/watch_predict_response.rbs +41 -0
- data/sig/prelude_sdk/models/watch_send_events_params.rbs +98 -0
- data/sig/prelude_sdk/models/watch_send_events_response.rbs +35 -0
- data/sig/prelude_sdk/models/watch_send_feedbacks_params.rbs +211 -0
- data/sig/prelude_sdk/models/watch_send_feedbacks_response.rbs +35 -0
- data/sig/prelude_sdk/models.rbs +15 -0
- data/sig/prelude_sdk/request_options.rbs +36 -0
- data/sig/prelude_sdk/resources/lookup.rbs +13 -0
- data/sig/prelude_sdk/resources/transactional.rbs +19 -0
- data/sig/prelude_sdk/resources/verification.rbs +22 -0
- data/sig/prelude_sdk/resources/watch.rbs +25 -0
- data/sig/prelude_sdk/version.rbs +3 -0
- metadata +182 -0
@@ -0,0 +1,187 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PreludeSDK
|
4
|
+
module Internal
|
5
|
+
module Type
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
# @abstract
|
9
|
+
#
|
10
|
+
# @generic Elem
|
11
|
+
#
|
12
|
+
# Hash of items of a given type.
|
13
|
+
class HashOf
|
14
|
+
include PreludeSDK::Internal::Type::Converter
|
15
|
+
include PreludeSDK::Internal::Util::SorbetRuntimeSupport
|
16
|
+
|
17
|
+
private_class_method :new
|
18
|
+
|
19
|
+
# @overload [](type_info, spec = {})
|
20
|
+
#
|
21
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class]
|
22
|
+
#
|
23
|
+
# @param spec [Hash{Symbol=>Object}] .
|
24
|
+
#
|
25
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
26
|
+
#
|
27
|
+
# @option spec [Proc] :enum
|
28
|
+
#
|
29
|
+
# @option spec [Proc] :union
|
30
|
+
#
|
31
|
+
# @option spec [Boolean] :"nil?"
|
32
|
+
#
|
33
|
+
# @return [self]
|
34
|
+
def self.[](...) = new(...)
|
35
|
+
|
36
|
+
# @api public
|
37
|
+
#
|
38
|
+
# @param other [Object]
|
39
|
+
#
|
40
|
+
# @return [Boolean]
|
41
|
+
def ===(other)
|
42
|
+
type = item_type
|
43
|
+
case other
|
44
|
+
in Hash
|
45
|
+
other.all? do |key, val|
|
46
|
+
case [key, val]
|
47
|
+
in [Symbol | String, ^type]
|
48
|
+
true
|
49
|
+
else
|
50
|
+
false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
else
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# @api public
|
59
|
+
#
|
60
|
+
# @param other [Object]
|
61
|
+
#
|
62
|
+
# @return [Boolean]
|
63
|
+
def ==(other)
|
64
|
+
# rubocop:disable Layout/LineLength
|
65
|
+
other.is_a?(PreludeSDK::Internal::Type::HashOf) && other.nilable? == nilable? && other.item_type == item_type
|
66
|
+
# rubocop:enable Layout/LineLength
|
67
|
+
end
|
68
|
+
|
69
|
+
# @api public
|
70
|
+
#
|
71
|
+
# @return [Integer]
|
72
|
+
def hash = [self.class, item_type].hash
|
73
|
+
|
74
|
+
# @api private
|
75
|
+
#
|
76
|
+
# @param value [Hash{Object=>Object}, Object]
|
77
|
+
#
|
78
|
+
# @param state [Hash{Symbol=>Object}] .
|
79
|
+
#
|
80
|
+
# @option state [Boolean] :translate_names
|
81
|
+
#
|
82
|
+
# @option state [Boolean] :strictness
|
83
|
+
#
|
84
|
+
# @option state [Hash{Symbol=>Object}] :exactness
|
85
|
+
#
|
86
|
+
# @option state [Class<StandardError>] :error
|
87
|
+
#
|
88
|
+
# @option state [Integer] :branched
|
89
|
+
#
|
90
|
+
# @return [Hash{Symbol=>Object}, Object]
|
91
|
+
def coerce(value, state:)
|
92
|
+
exactness = state.fetch(:exactness)
|
93
|
+
|
94
|
+
unless value.is_a?(Hash)
|
95
|
+
exactness[:no] += 1
|
96
|
+
state[:error] = TypeError.new("#{value.class} can't be coerced into #{Hash}")
|
97
|
+
return value
|
98
|
+
end
|
99
|
+
|
100
|
+
target = item_type
|
101
|
+
exactness[:yes] += 1
|
102
|
+
value
|
103
|
+
.to_h do |key, val|
|
104
|
+
k = key.is_a?(String) ? key.to_sym : key
|
105
|
+
v =
|
106
|
+
case [nilable?, val]
|
107
|
+
in [true, nil]
|
108
|
+
exactness[:yes] += 1
|
109
|
+
nil
|
110
|
+
else
|
111
|
+
PreludeSDK::Internal::Type::Converter.coerce(target, val, state: state)
|
112
|
+
end
|
113
|
+
|
114
|
+
exactness[:no] += 1 unless k.is_a?(Symbol)
|
115
|
+
[k, v]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# @api private
|
120
|
+
#
|
121
|
+
# @param value [Hash{Object=>Object}, Object]
|
122
|
+
#
|
123
|
+
# @param state [Hash{Symbol=>Object}] .
|
124
|
+
#
|
125
|
+
# @option state [Boolean] :can_retry
|
126
|
+
#
|
127
|
+
# @return [Hash{Symbol=>Object}, Object]
|
128
|
+
def dump(value, state:)
|
129
|
+
target = item_type
|
130
|
+
if value.is_a?(Hash)
|
131
|
+
value.transform_values do
|
132
|
+
PreludeSDK::Internal::Type::Converter.dump(target, _1, state: state)
|
133
|
+
end
|
134
|
+
else
|
135
|
+
super
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# @api private
|
140
|
+
#
|
141
|
+
# @return [Object]
|
142
|
+
def to_sorbet_type
|
143
|
+
T::Hash[PreludeSDK::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(item_type)]
|
144
|
+
end
|
145
|
+
|
146
|
+
# @api private
|
147
|
+
#
|
148
|
+
# @return [generic<Elem>]
|
149
|
+
protected def item_type = @item_type_fn.call
|
150
|
+
|
151
|
+
# @api private
|
152
|
+
#
|
153
|
+
# @return [Boolean]
|
154
|
+
protected def nilable? = @nilable
|
155
|
+
|
156
|
+
# @api private
|
157
|
+
#
|
158
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class]
|
159
|
+
#
|
160
|
+
# @param spec [Hash{Symbol=>Object}] .
|
161
|
+
#
|
162
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
163
|
+
#
|
164
|
+
# @option spec [Proc] :enum
|
165
|
+
#
|
166
|
+
# @option spec [Proc] :union
|
167
|
+
#
|
168
|
+
# @option spec [Boolean] :"nil?"
|
169
|
+
def initialize(type_info, spec = {})
|
170
|
+
@item_type_fn = PreludeSDK::Internal::Type::Converter.type_info(type_info || spec)
|
171
|
+
@nilable = spec.fetch(:nil?, false)
|
172
|
+
end
|
173
|
+
|
174
|
+
# @api private
|
175
|
+
#
|
176
|
+
# @param depth [Integer]
|
177
|
+
#
|
178
|
+
# @return [String]
|
179
|
+
def inspect(depth: 0)
|
180
|
+
items = PreludeSDK::Internal::Type::Converter.inspect(item_type, depth: depth.succ)
|
181
|
+
|
182
|
+
"#{self.class}[#{[items, nilable? ? 'nil' : nil].compact.join(' | ')}]"
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PreludeSDK
|
4
|
+
module Internal
|
5
|
+
module Type
|
6
|
+
# @api private
|
7
|
+
module RequestParameters
|
8
|
+
# @!attribute request_options
|
9
|
+
# Options to specify HTTP behaviour for this request.
|
10
|
+
#
|
11
|
+
# @return [PreludeSDK::RequestOptions, Hash{Symbol=>Object}]
|
12
|
+
|
13
|
+
# @param mod [Module]
|
14
|
+
def self.included(mod)
|
15
|
+
raise ArgumentError.new(mod) unless mod <= PreludeSDK::Internal::Type::BaseModel
|
16
|
+
|
17
|
+
mod.optional(:request_options, PreludeSDK::RequestOptions)
|
18
|
+
end
|
19
|
+
|
20
|
+
# @api private
|
21
|
+
module Converter
|
22
|
+
# @api private
|
23
|
+
#
|
24
|
+
# @param params [Object]
|
25
|
+
#
|
26
|
+
# @return [Array(Object, Hash{Symbol=>Object})]
|
27
|
+
def dump_request(params)
|
28
|
+
state = {can_retry: true}
|
29
|
+
case (dumped = dump(params, state: state))
|
30
|
+
in Hash
|
31
|
+
options = PreludeSDK::Internal::Util.coerce_hash!(dumped[:request_options]).to_h
|
32
|
+
request_options = state.fetch(:can_retry) ? options : {**options, max_retries: 0}
|
33
|
+
[dumped.except(:request_options), request_options]
|
34
|
+
else
|
35
|
+
[dumped, nil]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PreludeSDK
|
4
|
+
module Internal
|
5
|
+
module Type
|
6
|
+
# @api private
|
7
|
+
module Union
|
8
|
+
include PreludeSDK::Internal::Type::Converter
|
9
|
+
include PreludeSDK::Internal::Util::SorbetRuntimeSupport
|
10
|
+
|
11
|
+
# @api private
|
12
|
+
#
|
13
|
+
# All of the specified variant info for this union.
|
14
|
+
#
|
15
|
+
# @return [Array<Array(Symbol, Proc)>]
|
16
|
+
private def known_variants = (@known_variants ||= [])
|
17
|
+
|
18
|
+
# @api private
|
19
|
+
#
|
20
|
+
# @return [Array<Array(Symbol, Object)>]
|
21
|
+
protected def derefed_variants
|
22
|
+
known_variants.map { |key, variant_fn| [key, variant_fn.call] }
|
23
|
+
end
|
24
|
+
|
25
|
+
# All of the specified variants for this union.
|
26
|
+
#
|
27
|
+
# @return [Array<Object>]
|
28
|
+
def variants = derefed_variants.map(&:last)
|
29
|
+
|
30
|
+
# @api private
|
31
|
+
#
|
32
|
+
# @param property [Symbol]
|
33
|
+
private def discriminator(property)
|
34
|
+
case property
|
35
|
+
in Symbol
|
36
|
+
@discriminator = property
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# @api private
|
41
|
+
#
|
42
|
+
# @param key [Symbol, Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class]
|
43
|
+
#
|
44
|
+
# @param spec [Hash{Symbol=>Object}, Proc, PreludeSDK::Internal::Type::Converter, Class] .
|
45
|
+
#
|
46
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
47
|
+
#
|
48
|
+
# @option spec [Proc] :enum
|
49
|
+
#
|
50
|
+
# @option spec [Proc] :union
|
51
|
+
#
|
52
|
+
# @option spec [Boolean] :"nil?"
|
53
|
+
private def variant(key, spec = nil)
|
54
|
+
variant_info =
|
55
|
+
case key
|
56
|
+
in Symbol
|
57
|
+
[key, PreludeSDK::Internal::Type::Converter.type_info(spec)]
|
58
|
+
in Proc | PreludeSDK::Internal::Type::Converter | Class | Hash
|
59
|
+
[nil, PreludeSDK::Internal::Type::Converter.type_info(key)]
|
60
|
+
end
|
61
|
+
|
62
|
+
known_variants << variant_info
|
63
|
+
end
|
64
|
+
|
65
|
+
# @api private
|
66
|
+
#
|
67
|
+
# @param value [Object]
|
68
|
+
#
|
69
|
+
# @return [PreludeSDK::Internal::Type::Converter, Class, nil]
|
70
|
+
private def resolve_variant(value)
|
71
|
+
case [@discriminator, value]
|
72
|
+
in [_, PreludeSDK::Internal::Type::BaseModel]
|
73
|
+
value.class
|
74
|
+
in [Symbol, Hash]
|
75
|
+
key = value.fetch(@discriminator) do
|
76
|
+
value.fetch(@discriminator.to_s, PreludeSDK::Internal::OMIT)
|
77
|
+
end
|
78
|
+
|
79
|
+
return nil if key == PreludeSDK::Internal::OMIT
|
80
|
+
|
81
|
+
key = key.to_sym if key.is_a?(String)
|
82
|
+
known_variants.find { |k,| k == key }&.last&.call
|
83
|
+
else
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# rubocop:disable Style/HashEachMethods
|
89
|
+
# rubocop:disable Style/CaseEquality
|
90
|
+
|
91
|
+
# @api public
|
92
|
+
#
|
93
|
+
# @param other [Object]
|
94
|
+
#
|
95
|
+
# @return [Boolean]
|
96
|
+
def ===(other)
|
97
|
+
known_variants.any? do |_, variant_fn|
|
98
|
+
variant_fn.call === other
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# @api public
|
103
|
+
#
|
104
|
+
# @param other [Object]
|
105
|
+
#
|
106
|
+
# @return [Boolean]
|
107
|
+
def ==(other)
|
108
|
+
PreludeSDK::Internal::Type::Union === other && other.derefed_variants == derefed_variants
|
109
|
+
end
|
110
|
+
|
111
|
+
# @api public
|
112
|
+
#
|
113
|
+
# @return [Integer]
|
114
|
+
def hash = variants.hash
|
115
|
+
|
116
|
+
# @api private
|
117
|
+
#
|
118
|
+
# Tries to efficiently coerce the given value to one of the known variants.
|
119
|
+
#
|
120
|
+
# If the value cannot match any of the known variants, the coercion is considered
|
121
|
+
# non-viable and returns the original value.
|
122
|
+
#
|
123
|
+
# @param value [Object]
|
124
|
+
#
|
125
|
+
# @param state [Hash{Symbol=>Object}] .
|
126
|
+
#
|
127
|
+
# @option state [Boolean] :translate_names
|
128
|
+
#
|
129
|
+
# @option state [Boolean] :strictness
|
130
|
+
#
|
131
|
+
# @option state [Hash{Symbol=>Object}] :exactness
|
132
|
+
#
|
133
|
+
# @option state [Class<StandardError>] :error
|
134
|
+
#
|
135
|
+
# @option state [Integer] :branched
|
136
|
+
#
|
137
|
+
# @return [Object]
|
138
|
+
def coerce(value, state:)
|
139
|
+
if (target = resolve_variant(value))
|
140
|
+
return PreludeSDK::Internal::Type::Converter.coerce(target, value, state: state)
|
141
|
+
end
|
142
|
+
|
143
|
+
strictness = state.fetch(:strictness)
|
144
|
+
exactness = state.fetch(:exactness)
|
145
|
+
|
146
|
+
alternatives = []
|
147
|
+
known_variants.each do |_, variant_fn|
|
148
|
+
target = variant_fn.call
|
149
|
+
exact = state[:exactness] = {yes: 0, no: 0, maybe: 0}
|
150
|
+
state[:branched] += 1
|
151
|
+
|
152
|
+
coerced = PreludeSDK::Internal::Type::Converter.coerce(target, value, state: state)
|
153
|
+
yes, no, maybe = exact.values
|
154
|
+
if (no + maybe).zero? || (!strictness && yes.positive?)
|
155
|
+
exact.each { exactness[_1] += _2 }
|
156
|
+
state[:exactness] = exactness
|
157
|
+
return coerced
|
158
|
+
elsif maybe.positive?
|
159
|
+
alternatives << [[-yes, -maybe, no], exact, coerced]
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
case alternatives.sort_by!(&:first)
|
164
|
+
in []
|
165
|
+
exactness[:no] += 1
|
166
|
+
state[:error] = ArgumentError.new("no matching variant for #{value.inspect}")
|
167
|
+
value
|
168
|
+
in [[_, exact, coerced], *]
|
169
|
+
exact.each { exactness[_1] += _2 }
|
170
|
+
coerced
|
171
|
+
end
|
172
|
+
.tap { state[:exactness] = exactness }
|
173
|
+
ensure
|
174
|
+
state[:strictness] = strictness
|
175
|
+
end
|
176
|
+
|
177
|
+
# @api private
|
178
|
+
#
|
179
|
+
# @param value [Object]
|
180
|
+
#
|
181
|
+
# @param state [Hash{Symbol=>Object}] .
|
182
|
+
#
|
183
|
+
# @option state [Boolean] :can_retry
|
184
|
+
#
|
185
|
+
# @return [Object]
|
186
|
+
def dump(value, state:)
|
187
|
+
if (target = resolve_variant(value))
|
188
|
+
return PreludeSDK::Internal::Type::Converter.dump(target, value, state: state)
|
189
|
+
end
|
190
|
+
|
191
|
+
known_variants.each do
|
192
|
+
target = _2.call
|
193
|
+
return PreludeSDK::Internal::Type::Converter.dump(target, value, state: state) if target === value
|
194
|
+
end
|
195
|
+
|
196
|
+
super
|
197
|
+
end
|
198
|
+
|
199
|
+
# @api private
|
200
|
+
#
|
201
|
+
# @return [Object]
|
202
|
+
def to_sorbet_type
|
203
|
+
types = variants.map { PreludeSDK::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(_1) }.uniq
|
204
|
+
case types
|
205
|
+
in []
|
206
|
+
T.noreturn
|
207
|
+
in [type]
|
208
|
+
type
|
209
|
+
else
|
210
|
+
T.any(*types)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
# rubocop:enable Style/CaseEquality
|
215
|
+
# rubocop:enable Style/HashEachMethods
|
216
|
+
|
217
|
+
# @api private
|
218
|
+
#
|
219
|
+
# @param depth [Integer]
|
220
|
+
#
|
221
|
+
# @return [String]
|
222
|
+
def inspect(depth: 0)
|
223
|
+
if depth.positive?
|
224
|
+
return is_a?(Module) ? super() : self.class.name
|
225
|
+
end
|
226
|
+
|
227
|
+
members = variants.map { PreludeSDK::Internal::Type::Converter.inspect(_1, depth: depth.succ) }
|
228
|
+
prefix = is_a?(Module) ? name : self.class.name
|
229
|
+
|
230
|
+
"#{prefix}[#{members.join(' | ')}]"
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PreludeSDK
|
4
|
+
module Internal
|
5
|
+
module Type
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
# @abstract
|
9
|
+
#
|
10
|
+
# When we don't know what to expect for the value.
|
11
|
+
class Unknown
|
12
|
+
extend PreludeSDK::Internal::Type::Converter
|
13
|
+
extend PreludeSDK::Internal::Util::SorbetRuntimeSupport
|
14
|
+
|
15
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
16
|
+
|
17
|
+
private_class_method :new
|
18
|
+
|
19
|
+
# @api public
|
20
|
+
#
|
21
|
+
# @param other [Object]
|
22
|
+
#
|
23
|
+
# @return [Boolean]
|
24
|
+
def self.===(other) = true
|
25
|
+
|
26
|
+
# @api public
|
27
|
+
#
|
28
|
+
# @param other [Object]
|
29
|
+
#
|
30
|
+
# @return [Boolean]
|
31
|
+
def self.==(other) = other.is_a?(Class) && other <= PreludeSDK::Internal::Type::Unknown
|
32
|
+
|
33
|
+
class << self
|
34
|
+
# @api private
|
35
|
+
#
|
36
|
+
# No coercion needed for Unknown type.
|
37
|
+
#
|
38
|
+
# @param value [Object]
|
39
|
+
#
|
40
|
+
# @param state [Hash{Symbol=>Object}] .
|
41
|
+
#
|
42
|
+
# @option state [Boolean] :translate_names
|
43
|
+
#
|
44
|
+
# @option state [Boolean] :strictness
|
45
|
+
#
|
46
|
+
# @option state [Hash{Symbol=>Object}] :exactness
|
47
|
+
#
|
48
|
+
# @option state [Class<StandardError>] :error
|
49
|
+
#
|
50
|
+
# @option state [Integer] :branched
|
51
|
+
#
|
52
|
+
# @return [Object]
|
53
|
+
def coerce(value, state:)
|
54
|
+
state.fetch(:exactness)[:yes] += 1
|
55
|
+
value
|
56
|
+
end
|
57
|
+
|
58
|
+
# @!method dump(value, state:)
|
59
|
+
# @api private
|
60
|
+
#
|
61
|
+
# @param value [Object]
|
62
|
+
#
|
63
|
+
# @param state [Hash{Symbol=>Object}] .
|
64
|
+
#
|
65
|
+
# @option state [Boolean] :can_retry
|
66
|
+
#
|
67
|
+
# @return [Object]
|
68
|
+
|
69
|
+
# @api private
|
70
|
+
#
|
71
|
+
# @return [Object]
|
72
|
+
def to_sorbet_type
|
73
|
+
T.anything
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|