Skip to content

Commit b3f0632

Browse files
chore(internal): improve response envelope unwrap functionality
1 parent 200103f commit b3f0632

7 files changed

Lines changed: 55 additions & 25 deletions

File tree

lib/orb/internal/transport/base_client.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ def initialize(
214214
#
215215
# @option req [Object, nil] :body
216216
#
217-
# @option req [Symbol, nil] :unwrap
217+
# @option req [Symbol, Integer, Array<Symbol, Integer>, Proc, nil] :unwrap
218218
#
219219
# @option req [Class<Orb::Internal::Type::BasePage>, nil] :page
220220
#
@@ -415,7 +415,7 @@ def initialize(
415415
#
416416
# @param body [Object, nil]
417417
#
418-
# @param unwrap [Symbol, nil]
418+
# @param unwrap [Symbol, Integer, Array<Symbol, Integer>, Proc, nil]
419419
#
420420
# @param page [Class<Orb::Internal::Type::BasePage>, nil]
421421
#

lib/orb/internal/util.rb

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -175,30 +175,31 @@ def deep_merge(*values, sentinel: nil, concat: false)
175175
# @api private
176176
#
177177
# @param data [Hash{Symbol=>Object}, Array<Object>, Object]
178-
# @param pick [Symbol, Integer, Array<Symbol, Integer>, nil]
179-
# @param sentinel [Object, nil]
178+
# @param pick [Symbol, Integer, Array<Symbol, Integer>, Proc, nil]
180179
# @param blk [Proc, nil]
181180
#
182181
# @return [Object, nil]
183-
def dig(data, pick, sentinel = nil, &blk)
184-
case [data, pick, blk]
185-
in [_, nil, nil]
182+
def dig(data, pick, &blk)
183+
case [data, pick]
184+
in [_, nil]
186185
data
187-
in [Hash, Symbol, _] | [Array, Integer, _]
188-
blk.nil? ? data.fetch(pick, sentinel) : data.fetch(pick, &blk)
189-
in [Hash | Array, Array, _]
186+
in [Hash, Symbol] | [Array, Integer]
187+
data.fetch(pick) { blk&.call }
188+
in [Hash | Array, Array]
190189
pick.reduce(data) do |acc, key|
191190
case acc
192191
in Hash if acc.key?(key)
193192
acc.fetch(key)
194193
in Array if key.is_a?(Integer) && key < acc.length
195194
acc[key]
196195
else
197-
return blk.nil? ? sentinel : blk.call
196+
return blk&.call
198197
end
199198
end
200-
in _
201-
blk.nil? ? sentinel : blk.call
199+
in [_, Proc]
200+
pick.call(data)
201+
else
202+
blk&.call
202203
end
203204
end
204205
end

rbi/lib/orb/internal/transport/base_client.rbi

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@ module Orb
2424
)]
2525
),
2626
body: T.nilable(T.anything),
27-
unwrap: T.nilable(Symbol),
27+
unwrap: T.nilable(
28+
T.any(
29+
Symbol,
30+
Integer,
31+
T::Array[T.any(Symbol, Integer)],
32+
T.proc.params(arg0: T.anything).returns(T.anything)
33+
)
34+
),
2835
page: T.nilable(T::Class[Orb::Internal::Type::BasePage[Orb::Internal::Type::BaseModel]]),
2936
stream: T.nilable(T::Class[T.anything]),
3037
model: T.nilable(Orb::Internal::Type::Converter::Input),
@@ -167,7 +174,14 @@ module Orb
167174
)]
168175
),
169176
body: T.nilable(T.anything),
170-
unwrap: T.nilable(Symbol),
177+
unwrap: T.nilable(
178+
T.any(
179+
Symbol,
180+
Integer,
181+
T::Array[T.any(Symbol, Integer)],
182+
T.proc.params(arg0: T.anything).returns(T.anything)
183+
)
184+
),
171185
page: T.nilable(T::Class[Orb::Internal::Type::BasePage[Orb::Internal::Type::BaseModel]]),
172186
stream: T.nilable(T::Class[T.anything]),
173187
model: T.nilable(Orb::Internal::Type::Converter::Input),

rbi/lib/orb/internal/util.rbi

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,19 @@ module Orb
6868
sig do
6969
params(
7070
data: T.any(Orb::Internal::AnyHash, T::Array[T.anything], T.anything),
71-
pick: T.nilable(T.any(Symbol, Integer, T::Array[T.any(Symbol, Integer)])),
72-
sentinel: T.nilable(T.anything),
71+
pick: T.nilable(
72+
T.any(
73+
Symbol,
74+
Integer,
75+
T::Array[T.any(Symbol, Integer)],
76+
T.proc.params(arg0: T.anything).returns(T.anything)
77+
)
78+
),
7379
blk: T.nilable(T.proc.returns(T.anything))
7480
)
7581
.returns(T.nilable(T.anything))
7682
end
77-
def dig(data, pick, sentinel = nil, &blk); end
83+
def dig(data, pick, &blk); end
7884
end
7985

8086
class << self

sig/orb/internal/transport/base_client.rbs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ module Orb
1111
| Integer
1212
| ::Array[(String | Integer)?])?]?,
1313
body: top?,
14-
unwrap: Symbol?,
14+
unwrap: (Symbol
15+
| Integer
16+
| ::Array[(Symbol | Integer)]
17+
| (^(top arg0) -> top))?,
1518
page: Class?,
1619
stream: Class?,
1720
model: Orb::Internal::Type::Converter::input?,
@@ -96,7 +99,10 @@ module Orb
9699
| Integer
97100
| ::Array[(String | Integer)?])?]?,
98101
?body: top?,
99-
?unwrap: Symbol?,
102+
?unwrap: (Symbol
103+
| Integer
104+
| ::Array[(Symbol | Integer)]
105+
| (^(top arg0) -> top))?,
100106
?page: Class?,
101107
?stream: Class?,
102108
?model: Orb::Internal::Type::Converter::input?,

sig/orb/internal/util.rbs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ module Orb
2929

3030
def self?.dig: (
3131
::Hash[Symbol, top] | ::Array[top] | top data,
32-
(Symbol | Integer | ::Array[(Symbol | Integer)])? pick,
33-
?top? sentinel
32+
(Symbol
33+
| Integer
34+
| ::Array[(Symbol | Integer)]
35+
| (^(top arg0) -> top))? pick
3436
) {
3537
-> top?
3638
} -> top?

test/orb/internal/util_test.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,9 @@ def test_dig
8787
Orb::Internal::Util.dig([], 1.0) => nil
8888

8989
Orb::Internal::Util.dig(Object, 1) => nil
90-
Orb::Internal::Util.dig([], 1.0, 2) => 2
9190
Orb::Internal::Util.dig([], 1.0) { 2 } => 2
91+
Orb::Internal::Util.dig([], ->(_) { 2 }) => 2
92+
Orb::Internal::Util.dig([1], -> { _1 in [1] }) => true
9293
end
9394
end
9495
end
@@ -165,9 +166,9 @@ def test_json_content
165166
"application/vnd.github.v3+json" => true,
166167
"application/vnd.api+json" => true
167168
}
168-
cases.each do |header, _verdict|
169+
cases.each do |header, verdict|
169170
assert_pattern do
170-
Orb::Internal::Util::JSON_CONTENT.match?(header) => verdict
171+
Orb::Internal::Util::JSON_CONTENT.match?(header) => ^verdict
171172
end
172173
end
173174
end

0 commit comments

Comments
 (0)