Skip to content

Commit

Permalink
Support more literal types in use_yaml_discriminator (#10149)
Browse files Browse the repository at this point in the history
  • Loading branch information
straight-shoota authored Jan 7, 2021
1 parent 524c52e commit 76768fe
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
41 changes: 41 additions & 0 deletions spec/std/yaml/serializable_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,33 @@ class YAMLWithShape
property shape : YAMLShape
end

enum YAMLVariableDiscriminatorEnumFoo
Foo = 4
end

class YAMLVariableDiscriminatorValueType
include YAML::Serializable

use_yaml_discriminator "type", {
0 => YAMLVariableDiscriminatorNumber,
"1" => YAMLVariableDiscriminatorString,
true => YAMLVariableDiscriminatorBool,
YAMLVariableDiscriminatorEnumFoo::Foo => YAMLVariableDiscriminatorEnum,
}
end

class YAMLVariableDiscriminatorNumber < YAMLVariableDiscriminatorValueType
end

class YAMLVariableDiscriminatorString < YAMLVariableDiscriminatorValueType
end

class YAMLVariableDiscriminatorBool < YAMLVariableDiscriminatorValueType
end

class YAMLVariableDiscriminatorEnum < YAMLVariableDiscriminatorValueType
end

describe "YAML::Serializable" do
it "works with record" do
YAMLAttrPoint.new(1, 2).to_yaml.should eq "---\nx: 1\ny: 2\n"
Expand Down Expand Up @@ -891,6 +918,20 @@ describe "YAML::Serializable" do
point.x.should eq(1)
point.y.should eq(2)
end

it "deserializes with variable discriminator value type" do
object_number = YAMLVariableDiscriminatorValueType.from_yaml(%({"type": 0}))
object_number.should be_a(YAMLVariableDiscriminatorNumber)

object_string = YAMLVariableDiscriminatorValueType.from_yaml(%({"type": "1"}))
object_string.should be_a(YAMLVariableDiscriminatorString)

object_bool = YAMLVariableDiscriminatorValueType.from_yaml(%({"type": true}))
object_bool.should be_a(YAMLVariableDiscriminatorBool)

object_enum = YAMLVariableDiscriminatorValueType.from_yaml(%({"type": 4}))
object_enum.should be_a(YAMLVariableDiscriminatorEnum)
end
end

describe "namespaced classes" do
Expand Down
3 changes: 3 additions & 0 deletions src/yaml/serialization.cr
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,9 @@ module YAML
discriminator_value = value.value
case discriminator_value
{% for key, value in mapping %}
{% if key.is_a?(Path) %}
{% key = key.resolve %}
{% end %}
when {{key.id.stringify}}
return {{value.id}}.new(ctx, node)
{% end %}
Expand Down

0 comments on commit 76768fe

Please sign in to comment.