Skip to content

Commit 8de3341

Browse files
authored
Merge pull request #70 from jgaskins/patch-1
Let the Crystal compiler assign default values
2 parents 46722a2 + fc51e0d commit 8de3341

2 files changed

Lines changed: 36 additions & 2 deletions

File tree

spec/serializable_spec.cr

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,28 @@ class MessagePackAttrModuleTest
277277
end
278278
end
279279

280+
module MessagePackNamespace
281+
struct FooRequest
282+
include MessagePack::Serializable
283+
284+
getter foo : Foo
285+
getter bar = Bar.new
286+
end
287+
288+
struct Foo
289+
include MessagePack::Serializable
290+
getter id = "id:foo"
291+
end
292+
293+
struct Bar
294+
include MessagePack::Serializable
295+
getter id = "id:bar"
296+
297+
def initialize # Allow for default value above
298+
end
299+
end
300+
end
301+
280302
class MessagePackAttrModuleTest2 < MessagePackAttrModuleTest
281303
property bar : Int32
282304

@@ -933,4 +955,12 @@ describe "MessagePack mapping" do
933955
created.as(Discriminator::Created).created_at.should eq time
934956
updated.as(Discriminator::Updated).updated_at.should eq time
935957
end
958+
959+
describe "namespaced classes" do
960+
it "lets default values use the object's own namespace" do
961+
request = MessagePackNamespace::FooRequest.from_msgpack({foo: {} of String => String}.to_msgpack)
962+
request.foo.id.should eq "id:foo"
963+
request.bar.id.should eq "id:bar"
964+
end
965+
end
936966
end

src/message_pack/serializable.cr

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,16 @@ module MessagePack
207207

208208
{% if value[:nilable] %}
209209
{% if value[:has_default] != nil %}
210-
@{{name}} = %found{name} ? %var{name} : {{value[:default]}}
210+
if %found{name} && !%var{name}.nil?
211+
@{{name}} = %var{name}
212+
end
211213
{% else %}
212214
@{{name}} = %var{name}
213215
{% end %}
214216
{% elsif value[:has_default] %}
215-
@{{name}} = %var{name}.nil? ? {{value[:default]}} : %var{name}
217+
if %found{name} && !%var{name}.nil?
218+
@{{name}} = %var{name}
219+
end
216220
{% else %}
217221
@{{name}} = (%var{name}).as({{value[:type]}})
218222
{% end %}

0 commit comments

Comments
 (0)