Class: Crystalline::DiscriminatedUnion

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#discriminatorObject (readonly)

Returns the value of attribute discriminator.



61
62
63
# File 'lib/crystalline/types.rb', line 61

def discriminator
  @discriminator
end

#variantsObject (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