Add support for nillables with `T | Nil` syntax.

This commit is contained in:
Brian J. Cardiff 2017-03-06 12:18:04 -03:00
parent 0797ce72a3
commit 2886c207e0
2 changed files with 15 additions and 1 deletions

View File

@ -36,6 +36,13 @@ class MappingWithNilTypes
}) })
end end
class MappingWithNilUnionTypes
DB.mapping({
c0: {type: Int32 | Nil, default: 10},
c1: Nil | String,
})
end
class MappingWithKeys class MappingWithKeys
DB.mapping({ DB.mapping({
foo: {type: Int32, key: "c0"}, foo: {type: Int32, key: "c0"},
@ -117,10 +124,12 @@ describe "DB.mapping" do
it "should initialize a mapping with nilable types if columns are missing" do it "should initialize a mapping with nilable types if columns are missing" do
expect_mapping("1", MappingWithNilTypes, {c0: 1, c1: nil}) expect_mapping("1", MappingWithNilTypes, {c0: 1, c1: nil})
expect_mapping("1", MappingWithNilUnionTypes, {c0: 1, c1: nil})
end end
it "should initialize a mapping with nilable types ignoring default value if NULL" do it "should initialize a mapping with nilable types ignoring default value if NULL" do
expect_mapping("NULL,a", MappingWithNilTypes, {c0: nil, c1: "a"}) expect_mapping("NULL,a", MappingWithNilTypes, {c0: nil, c1: "a"})
expect_mapping("NULL,a", MappingWithNilUnionTypes, {c0: nil, c1: "a"})
end end
it "should initialize a mapping with different keys" do it "should initialize a mapping with different keys" do

View File

@ -66,6 +66,11 @@ module DB
{% for key, value in properties %} {% for key, value in properties %}
{% value[:nilable] = true if value[:type].is_a?(Generic) && value[:type].type_vars.map(&.resolve).includes?(Nil) %} {% value[:nilable] = true if value[:type].is_a?(Generic) && value[:type].type_vars.map(&.resolve).includes?(Nil) %}
{% if value[:type].is_a?(Call) && value[:type].name == "|" &&
(value[:type].receiver.resolve == Nil || value[:type].args.map(&.resolve).any?(&.==(Nil))) %}
{% value[:nilable] = true %}
{% end %}
{% end %} {% end %}
{% for key, value in properties %} {% for key, value in properties %}
@ -103,7 +108,7 @@ module DB
{% if value[:converter] %} {% if value[:converter] %}
{{value[:converter]}}.from_rs(%rs) {{value[:converter]}}.from_rs(%rs)
{% elsif value[:nilable] || value[:default] != nil %} {% elsif value[:nilable] || value[:default] != nil %}
%rs.read(Union({{value[:type]}} | Nil)) %rs.read(::Union({{value[:type]}} | Nil))
{% else %} {% else %}
%rs.read({{value[:type]}}) %rs.read({{value[:type]}})
{% end %} {% end %}