Class: Crystalline::DiscriminatedUnion
- Inherits:
-
Object
- Object
- Crystalline::DiscriminatedUnion
- Defined in:
- lib/crystalline/types.rb
Overview
Forward-compatible discriminated union parser. Known discriminator values are deserialized to their mapped types. Unknown or invalid payloads are captured as Crystalline::Unknown.
Instance Attribute Summary collapse
-
#discriminator ⇒ Object
readonly
Returns the value of attribute discriminator.
-
#variants ⇒ Object
readonly
Returns the value of attribute variants.
Instance Method Summary collapse
-
#initialize(discriminator, variants) ⇒ DiscriminatedUnion
constructor
A new instance of DiscriminatedUnion.
- #parse(payload) ⇒ Object
Constructor Details
#initialize(discriminator, variants) ⇒ DiscriminatedUnion
Returns a new instance of DiscriminatedUnion.
63 64 65 66 |
# File 'lib/crystalline/types.rb', line 63 def initialize(discriminator, variants) @discriminator = discriminator @variants = variants end |
Instance Attribute Details
#discriminator ⇒ Object (readonly)
Returns the value of attribute discriminator.
61 62 63 |
# File 'lib/crystalline/types.rb', line 61 def discriminator @discriminator end |
#variants ⇒ Object (readonly)
Returns the value of attribute variants.
61 62 63 |
# File 'lib/crystalline/types.rb', line 61 def variants @variants end |
Instance Method Details
#parse(payload) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/crystalline/types.rb', line 68 def parse(payload) unless payload.is_a?(::Hash) return Unknown.new(raw: payload) end disc_value = payload[@discriminator] unless disc_value.is_a?(::String) return Unknown.new(raw: payload) end variant_type = @variants[disc_value] unless variant_type return Unknown.new(raw: payload) end begin Crystalline.unmarshal_json(payload, variant_type) rescue StandardError Unknown.new(raw: payload) end end |