Class: Apiwork::Union

Inherits:
Object
  • Object
show all
Defined in:
lib/apiwork/union.rb

Direct Known Subclasses

API::Union, Contract::Union

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(discriminator: nil) ⇒ Union

Returns a new instance of Union.



8
9
10
11
# File 'lib/apiwork/union.rb', line 8

def initialize(discriminator: nil)
  @discriminator = discriminator
  @variants = []
end

Instance Attribute Details

#discriminatorObject (readonly)

Returns the value of attribute discriminator.



5
6
7
# File 'lib/apiwork/union.rb', line 5

def discriminator
  @discriminator
end

#variantsObject (readonly)

Returns the value of attribute variants.



5
6
7
# File 'lib/apiwork/union.rb', line 5

def variants
  @variants
end

Instance Method Details

#variant(deprecated: false, description: nil, partial: false, tag: nil) {|variant| ... } ⇒ void

This method returns an undefined value.

Defines a union variant.

Examples:

instance_eval style

variant tag: 'card' do
  object do
    string :last_four
  end
end

yield style

variant tag: 'card' do |variant|
  variant.object do |object|
    object.string :last_four
  end
end

Parameters:

  • deprecated (Boolean) (defaults to: false)

    (false) Whether deprecated. Metadata included in exports.

  • description (String, nil) (defaults to: nil)

    (nil) The description. Metadata included in exports.

  • partial (Boolean) (defaults to: false)

    (false) Whether partial. Partial variants include only the specified fields.

  • tag (String, nil) (defaults to: nil)

    (nil) The discriminator tag value. Required when union has a discriminator.

Yields:

  • block defining the variant type

Yield Parameters:

Raises:



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/apiwork/union.rb', line 41

def variant(deprecated: false, description: nil, partial: false, tag: nil, &block)
  validate_tag!(tag)
  raise ConfigurationError, 'variant requires a block' unless block

  element = build_element
  block.arity.positive? ? yield(element) : element.instance_eval(&block)
  element.validate!

  data = {
    deprecated:,
    description:,
    partial:,
    tag:,
    custom_type: element.custom_type,
    enum: element.enum,
    format: element.format,
    max: element.max,
    min: element.min,
    of: element.inner,
    shape: element.shape,
    type: element.type,
    value: element.value,
  }.compact

  append_or_merge_variant(data, tag)
end