Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
56fa5e8
perf: reuse cached helpers across serde codecs
jterapin Sep 14, 2026
431b1f1
perf: optimize schema extension cache access
jterapin Sep 15, 2026
9d23058
perf: reference collection shapes directly
jterapin Sep 15, 2026
91f7cc6
perf: simplify schema shape dispatch
jterapin Sep 16, 2026
90d937a
fix: avoid reusing serde workers across calls
jterapin Sep 21, 2026
b627100
fix: align serde RBS contracts
jterapin Sep 21, 2026
89ce446
perf: optimize CBOR decoder reads
jterapin Sep 21, 2026
18c65ba
perf: decode CBOR headers once
jterapin Sep 21, 2026
049f52c
perf: reduce CBOR collection allocations
jterapin Sep 21, 2026
45461aa
perf: cache CBOR byte headers
jterapin Sep 21, 2026
9e0477c
perf: reduce JSON builder allocations
jterapin Sep 21, 2026
9c24f21
perf: avoid mutating unknown JSON unions
jterapin Sep 21, 2026
ec2013a
perf: optimize client request preparation
jterapin Sep 21, 2026
b972e21
perf: reduce client request allocations
jterapin Sep 23, 2026
c0748e2
perf: optimize XML serialization and timestamps
jterapin Sep 23, 2026
756702c
perf: reduce CBOR builder allocations
jterapin Sep 23, 2026
d9384c4
perf: optimize document conversion
jterapin Sep 23, 2026
f3c373e
perf: optimize host label validation
jterapin Sep 23, 2026
e669b25
perf: optimize CBOR bignum and union parsing
jterapin Sep 23, 2026
66931cd
perf: reduce XML attribute rendering allocations
jterapin Sep 23, 2026
7f9db9b
perf: prioritize common CBOR encoder types
jterapin Sep 23, 2026
4dd3a35
perf: optimize fixed response status checks
jterapin Sep 23, 2026
c3ed618
Revert "perf: reduce XML attribute rendering allocations"
jterapin Sep 23, 2026
8359e7e
perf: flatten XML extension metadata
jterapin Sep 23, 2026
b814174
fix: cache XML flattened as a boolean
jterapin Sep 23, 2026
a11857a
perf: streamline XML member metadata reads
jterapin Sep 23, 2026
a17269e
perf: flatten schema extension metadata
jterapin Sep 23, 2026
7c03e5e
refactor: simplify schema aggregate resolution
jterapin Sep 23, 2026
a59de30
perf: flatten JSON extension metadata
jterapin Sep 23, 2026
9e75a6b
perf: flatten HTTP extension metadata
jterapin Sep 23, 2026
2a2b8d3
perf: resolve operation metadata independently
jterapin Sep 23, 2026
a6ec87f
perf: reuse serde workers across calls
jterapin Sep 23, 2026
60958bf
fix: avoid HTTP extension method collision
jterapin Sep 23, 2026
298916f
test: cover concurrent CBOR codec reuse
jterapin Sep 23, 2026
1d4a94f
fix: preserve member block arguments
jterapin Sep 23, 2026
bb10436
docs: add private extension examples
jterapin Sep 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 22 additions & 20 deletions gems/smithy-cbor/lib/smithy-cbor/builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@ def build(shape, data)
private

def build_shape(shape, value)
case Schema::Extension.target_shape(shape)
when Schema::Extension::SHAPE_BLOB then blob(value)
when Schema::Extension::SHAPE_LIST then list(shape, value)
when Schema::Extension::SHAPE_MAP then map(shape, value)
when Schema::Extension::SHAPE_STRUCTURE then structure(shape, value)
when Schema::Extension::SHAPE_UNION then union(shape, value)
target = shape.target
case target
when Schema::Shapes::BlobShape then blob(value)
when Schema::Shapes::ListShape then list(shape, value)
when Schema::Shapes::MapShape then map(shape, value)
when Schema::Shapes::StructureShape then structure(shape, value)
when Schema::Shapes::UnionShape then union(shape, value)
else value
end
end
Expand All @@ -34,7 +35,7 @@ def blob(value)
def list(shape, values)
return if values.nil?

member, _target_shape, _sparse = Schema::Extension.list_member(shape.target)
member = shape.target.member
values.collect do |value|
build_shape(member, value)
end
Expand All @@ -43,40 +44,41 @@ def list(shape, values)
def map(shape, values)
return if values.nil?

value_member, _target_shape, _sparse = Schema::Extension.map_value_member(shape.target)
values.each.with_object({}) do |(key, value), data|
value_member = shape.target.value
data = {}
values.each do |key, value|
data[key] = build_shape(value_member, value)
end
data
end

def structure(shape, values)
return if values.nil?

index = Schema::Extension.member_index(shape.target)
values.each_pair.with_object({}) do |(member_name, value), data|
target = shape.target
data = {}
values.each_pair do |member_name, value|
next if value.nil?
next unless (entry = index[member_name])
next unless (member_shape = target.member(member_name))

wire_name, member_shape, _target_shape = entry
data[wire_name] = build_shape(member_shape, value)
data[member_shape.name] = build_shape(member_shape, value)
end
data
end

def union(shape, values)
return if values.nil?

key, value =
if values.is_a?(Schema::Union)
member_name, _member_shape = shape.target.member_by_type(values.class)
[member_name, values.value]
[values.member, values.value]
else
values.first
end
entry = Schema::Extension.member_index(shape.target)[key]
return {} unless entry
member_shape = shape.target.member(key)
return {} unless member_shape

wire_name, member_shape, _target_shape = entry
{ wire_name => build_shape(member_shape, value) }
{ member_shape.name => build_shape(member_shape, value) }
end
end
end
Expand Down
7 changes: 4 additions & 3 deletions gems/smithy-cbor/lib/smithy-cbor/codec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,23 @@ module Cbor
class Codec
# @param [Hash] options
def initialize(options = {})
@options = options
@builder = Builder.new(options).freeze
@parser = Parser.new(options).freeze
end

# @param [Shape] shape
# @param [Object] data
# @return [String, nil]
def build(shape, data)
Builder.new(@options).build(shape, data)
@builder.build(shape, data)
end

# @param [Shape] shape
# @param [String] bytes
# @param [Object, nil] result (nil)
# @return [Object, nil]
def parse(shape, bytes, result = nil)
Parser.new(@options).parse(shape, bytes, result)
@parser.parse(shape, bytes, result)
end
end
end
Expand Down
Loading
Loading