shale
shale copied to clipboard
Are union types supported?
Thanks for your hard work on this, this looks awesome!
I was curious of union types are supported (e.g. anyOf
in JSON Schema or xsd:choice
in XSD).
Hey, sorry for such a delay. They are supported when you generate models from the schema e.g.
json = <<~DATA
{
"type": "object",
"properties": {
"firstName": {
"anyOf": [
{ "type": "string" },
{ "type": "number" }
]
},
"lastName": {
"type": "string"
}
}
}
DATA
puts Shale::Schema.from_json([json]).values[0]
firstName attribute will have a type of Shale::Type::Value
meaning it will accept anything and won't type cast:
require 'shale'
class Root < Shale::Mapper
attribute :first_name, Shale::Type::Value
attribute :last_name, Shale::Type::String
json do
map 'firstName', to: :first_name
map 'lastName', to: :last_name
end
end
In XML schema ,xs:choice
has a different meaning:
xml = <<~DATA
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Person">
<xs:complexType>
<xs:choice>
<xs:element name="FirstName" type="xs:string"/>
<xs:element name="LastName" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
DATA
puts Shale::Schema.from_xml([xml]).values[0]
it will give you:
class Person < Shale::Mapper
attribute :first_name, Shale::Type::String
attribute :last_name, Shale::Type::String
xml do
root 'Person'
map_element 'FirstName', to: :first_name
map_element 'LastName', to: :last_name
end
end
If you want to generate schema from models, they are not supported as there is no way to mark attributes as belonging to union.
Hey, Im closing this issue, if you have any other questions, let me know.