Class: Teams::Cards::GeneratedCard

Inherits:
Object
  • Object
show all
Defined in:
lib/teams/cards/generated_base.rb

Overview

Base class for the generated Adaptive Card models. Serialization matches the other Teams SDKs' generated card classes: non-nil fields (including defaults) are emitted under their camelCase aliases, unknown extra fields pass through verbatim.

Direct Known Subclasses

SerializableObject

Constant Summary collapse

OMIT =
Object.new.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**values) ⇒ GeneratedCard

Returns a new instance of GeneratedCard.



55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/teams/cards/generated_base.rb', line 55

def initialize(**values)
  @values = {}
  self.class.card_fields.each do |name, spec|
    @values[name] = if values.key?(name)
      values.delete(name)
    elsif spec[:mutable]
      deep_dup(spec[:default])
    else
      spec[:default]
    end
  end
  values.each { |key, value| @values[key] = value }
end

Class Method Details

.array_adder(method_name, field_name) ⇒ Object



47
48
49
50
51
52
# File 'lib/teams/cards/generated_base.rb', line 47

def array_adder(method_name, field_name)
  define_method(method_name) do |item|
    (@values[field_name] ||= []) << item
    self
  end
end

.card_fieldsObject



15
16
17
# File 'lib/teams/cards/generated_base.rb', line 15

def card_fields
  @card_fields ||= superclass.respond_to?(:card_fields) ? superclass.card_fields.dup : {}
end

.field(name, alias_name, default = nil, mutable: false) ⇒ Object



19
20
21
22
23
24
25
26
27
28
# File 'lib/teams/cards/generated_base.rb', line 19

def field(name, alias_name, default = nil, mutable: false)
  card_fields[name] = { alias: alias_name, default:, mutable: }

  define_method(name) { @values[name] }
  define_method("#{name}=") { |value| @values[name] = value }
  define_method("with_#{name}") do |value|
    @values[name] = value
    self
  end
end

.positional_field(name) ⇒ Object

Ruby convenience preserved from the original hand-written classes: allows the first constructor argument to set the given field.



32
33
34
35
36
37
# File 'lib/teams/cards/generated_base.rb', line 32

def positional_field(name)
  define_method(:initialize) do |positional = OMIT, **values|
    values[name] = positional unless positional.equal?(OMIT)
    super(**values)
  end
end

.splat_field(name) ⇒ Object

Same, for classes whose hand-written predecessors took a splat.



40
41
42
43
44
45
# File 'lib/teams/cards/generated_base.rb', line 40

def splat_field(name)
  define_method(:initialize) do |*positional, **values|
    values[name] = positional.flatten unless positional.empty?
    super(**values)
  end
end

Instance Method Details

#to_hObject



69
70
71
72
73
74
75
76
# File 'lib/teams/cards/generated_base.rb', line 69

def to_h
  @values.each_with_object({}) do |(name, value), body|
    next if value.nil?

    spec = self.class.card_fields[name]
    body[spec ? spec[:alias] : camelize(name.to_s)] = serialize(value)
  end
end

#to_json(*args) ⇒ Object



78
79
80
# File 'lib/teams/cards/generated_base.rb', line 78

def to_json(*args)
  JSON.generate(to_h, *args)
end